Prozess killen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Prozess killen

Beitrag 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....
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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
Zuletzt geändert von RSBasic am 12.08.2009 15:22, insgesamt 1-mal geändert.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag 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

?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag 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...
Zuletzt geändert von Joel am 12.08.2009 15:59, insgesamt 1-mal geändert.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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").
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag 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!
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

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

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten