Prozess killen
Prozess killen
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....
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....
----------------------------------------------------------
PB 5.20 Beta 10 | Windows 7
PB 5.20 Beta 10 | Windows 7
@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
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
Zuletzt geändert von RSBasic am 12.08.2009 15:22, insgesamt 1-mal geändert.
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:
Falls du nach dem Classname suchen möchtest:
Du musst also entweder den Titel oder den Klassenname kennen.
\\Edit:
Mit Hilfe des Handles kannst du dann z.B. das Fenster schließen:
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
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
\\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
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...
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...
Zuletzt geändert von Joel am 12.08.2009 15:59, insgesamt 1-mal geändert.
----------------------------------------------------------
PB 5.20 Beta 10 | Windows 7
PB 5.20 Beta 10 | Windows 7
>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.
>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.
Oder du kannst auch diese Procedure verwenden:
Quelle: http://www.purebasic.fr/german/viewtopi ... 458#114458
Damit kannst du auch nach deinem Prozessnamen suchen (also in dem Fall mit ".exe").
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
Damit kannst du auch nach deinem Prozessnamen suchen (also in dem Fall mit ".exe").
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:
Vllt habt ihr auch was anderes, wäre nur schön, wenn das für Prozesse ist und nach Namen 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
----------------------------------------------------------
PB 5.20 Beta 10 | Windows 7
PB 5.20 Beta 10 | Windows 7
Entweder machst du das manuell per WinAPI, dann bitte SuFu benutzen. Es gibt reichlich Beispielcodes.
Oder einfach mit Hilfe der PBOSL_Process Library:
Oder einfach mit Hilfe der PBOSL_Process Library:
Code: Alles auswählen
KillAllProcess("Prozess.exe", 0)