Seite 1 von 2

Prozess killen

Verfasst: 12.08.2009 15:16
von Joel
Hi,

Ich suche eine Lib oder ein Dll. Diese sollte unter PB 4.40 verwenden werden können und einfach nur diese 2 Funktionen erlauben:

IsProcess() (Überprüft ob Prozess existiert [unabhängig von Runprocess])
KillProcess() (Killt diesen Prozess [unabhängig von Runprocess])

Wenn jemand eine Lib hat, die aber nur unter einer ältereren PB Version läuft und gerade etwas Zeit hat, kann er die 2 Befehle gerne in ein Dll auslagern und mir schicken^^


Vielen Dank im Voraus....

Verfasst: 12.08.2009 15:20
von RSBasic
@Joel
http://pbosl.purearea.net
Da gibt es eine ULib namens "Process".

Ansonsten kannst du mit FindWindowEx_() ermitteln, ob ein Prozess vorhanden ist.
Und mit PostMessage_() (#WM_CLOSE) das Programm beenden.

Falls du ein Prozess richtig killen willst, was eigentlich nicht empfehlendswert ist:
http://www.purebasic.fr/german/viewtopic.php?t=18693
http://www.purebasic.fr/german/viewtopic.php?t=4353

Verfasst: 12.08.2009 15:36
von Joel
Ich nehm die Windows API:

Wende ich das Prozess ermitteln so richtig an?

Debug FindWindowEx_(0, 0, "opera.exe", 0)

Wenn 0 dann kein Prozess
Wenn <> 0 dann existiert Prozess

?

Verfasst: 12.08.2009 15:43
von RSBasic
FindWindow_() ist dazu da, um den Handle des Fensters zu ermitteln.
D.h. als Rückgabewert bekommst du den Handle.
Falls das Fenster nicht gefunden werden konnte, dann bekommst du "0".

Beispiele:
Wenn du nach dem Titel des Fensters suchen möchtest, z.B. beim Notepad:

Code: Alles auswählen

EnableExplicit

Define hwnd

hwnd = FindWindow_(#Null,"Unbenannt - Editor")
If hwnd
  Debug "Fenster-Handle: "+Str(hwnd)
Else
  Debug "Das Fenster konnte nicht gefunden werden."
EndIf
Falls du nach dem Classname suchen möchtest:

Code: Alles auswählen

EnableExplicit

Define hwnd

hwnd = FindWindow_("notepad",#Null)
If hwnd
  Debug "Fenster-Handle: "+Str(hwnd)
Else
  Debug "Das Fenster konnte nicht gefunden werden."
EndIf
Du musst also entweder den Titel oder den Klassenname kennen.

\\Edit:

Mit Hilfe des Handles kannst du dann z.B. das Fenster schließen:

Code: Alles auswählen

EnableExplicit

Define hwnd

hwnd = FindWindow_(#Null,"Unbenannt - Editor")
If hwnd
  Debug "Fenster-Handle: "+Str(hwnd)
  Debug "Notepad wird beendet..."
  PostMessage_(hwnd,#WM_CLOSE,0,0)
Else
  Debug "Das Fenster konnte nicht gefunden werden."
EndIf

Verfasst: 12.08.2009 15:52
von Joel
Kann es sein, dass das nur bei Tasks und nicht bei Prozessen funktioniert.

Weil "Notepad" (Task) existiert.
Und "opera" (Minimimiert, Prozess) existiert nicht.

Und auch andere Tools von mir erkennt er nicht.

Habe ein Tool "CD" genannt, aber er findet es nicht (ebenfalls Prozess)


-----------------------------------------------------


ClassName ist ja der Prozessname, wie er in dem Taskmanager angezeigt wird, nur ohne ".exe" oder?


Edit: Habe gerade "thunderbird" geöffnet. Aber das kann er ebenfalls nicht ermitteln per Name. Nur per Überschrift kann es ermittelt werden. Aber ich möchte ja keine Tasks sondern Prozesse ermitteln...

Verfasst: 12.08.2009 15:58
von RSBasic
>Weil "Notepad" (Task) existiert.
>Und "opera" (Prozess" existiert nicht.
>ClassName ist ja der Prozessname, wie er in dem Taskmanager angezeigt wird, nur ohne ".exe" oder?
Nein, das ist nur der interne Name eines Fensters.
Z.b. wenn du in PB dein erstes Fenster erstellst, dann heißt dein Fenster "WindowClass_0".

Falls du Programme brauchst, um den Klassenname zu ermitteln: http://www.rsbasic.de/temp/ShoWin.exe

Btw: Falls du von einem Prozessnamen den Klassenname oder den Fenstertitel ermitteln möchtest, musst du mal die PureBoard-SuFu benutzen.
Ich hab den grad nicht parat.

\\Edit:
Ansonsten kannst du auch alle Prozesse auflisten und z.B. nach "explorer.exe" suchen.

Verfasst: 12.08.2009 16:06
von RSBasic
Oder du kannst auch diese Procedure verwenden:

Code: Alles auswählen

Structure PROCESSENTRY33
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.b[#MAX_PATH]
EndStructure

Procedure SearchProcess(Name.s)
  result.b = #False
  If OpenLibrary(0, "Kernel32.dll")
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
    ProcessFirst           = GetFunction(0, "Process32First")
    ProcessNext            = GetFunction(0, "Process32Next")
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, $2, 0)
      If Snapshot
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
        While ProcessFound
          PN$ = UCase(PeekS(@Process\szExeFile))
          If UCase(Name) = GetFilePart(PN$) : result = #True : EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
        Wend
      EndIf
      CloseHandle_(Snapshot)
    EndIf
    CloseLibrary(0)
  EndIf
  ProcedureReturn result
EndProcedure

If SearchProcess("notepad.exe")
  Debug "Programm läuft"
Else
  Debug "Programm nicht gefunden"
EndIf
Quelle: http://www.purebasic.fr/german/viewtopi ... 458#114458

Damit kannst du auch nach deinem Prozessnamen suchen (also in dem Fall mit ".exe").

Verfasst: 12.08.2009 16:15
von Joel
OJa, vielen Dank, funktioniert!!!!!!!!!!!!

So, jetzt bräuchte ich nur noch so eine Art Killer und zwar einen richtigen. Keine Angst, ist mein Programm, das ich kill^^

Habe hier was gefunden, brauche dafür aber die PID des Prozesses:

Code: Alles auswählen

Procedure KillProcess(pid) 
    phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, pid) 
    If phandle <> #Null 
        If TerminateProcess_ (phandle, 1) 
            result = #True 
        EndIf 
        CloseHandle_ (phandle) 
    EndIf 
    ProcedureReturn result 
EndProcedure
Vllt habt ihr auch was anderes, wäre nur schön, wenn das für Prozesse ist und nach Namen funktioniert!

Verfasst: 12.08.2009 16:31
von Joel

Verfasst: 12.08.2009 16:33
von RSBasic
Entweder machst du das manuell per WinAPI, dann bitte SuFu benutzen. Es gibt reichlich Beispielcodes.
Oder einfach mit Hilfe der PBOSL_Process Library:

Code: Alles auswählen

KillAllProcess("Prozess.exe", 0)