![]() |
Check ob ein Programm nicht mehr reagiert
Hiho,
ich würde gerne überprüfen ob ein externes Programm noch reagiert oder nicht. Nur weiss ich leider nicht so richtig wie ich da rangehen soll. Das Handle hole ich mir zur zeit folgendermaßen:
Delphi-Quellcode:
Die funktion sollte eigentlich einen Task Killen aber die hab ich nur so kurz modifiziert dass ich das Handle erhalte, weil es mit findwindow irgendwie nicht ging :-/
function FindTask(ExeFileName: String): Integer;
var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; ExeFileName := UpperCase(ExeFileName); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = ExeFileName) or (UpperCase(FProcessEntry32.szExeFile) = ExeFileName)) then Result := OpenProcess(PROCESS_TERMINATE,BOOL(0), FProcessEntry32.th32ProcessID); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;
Delphi-Quellcode:
GetLastError sagt nur Zugriff verweigert :(
procedure TForm1.Button1Click(Sender: TObject);
var hWindowHandle: HWND; Res,Err: Cardinal; begin hWindowHandle := FindTask('Freezer.exe'); if (hWindowHandle = 0) or (hWindowHandle = INVALID_HANDLE_VALUE) then Exit; Res := WaitForSingleObject(hWindowHandle,200); Err := GetLastError; ShowMessage(IntToStr(Res) + ': ' + SysErrorMessage(Res) + #13#10 + IntToStr(Err) + ': ' + SysErrorMessage(Err)); end; Ich hoffe ihr könnt mich aufn richtigen weg schubsen! MfG Sereby |
Re: Check ob ein Programm nicht mehr reagiert
du könntest dem Programm eine nachticht per PostMessage(oder Verwandte) schicken
und das andere Programm schickt dir dann eine Antwort zurück ... kommt keine, dann ist da was eingefrohren. Windows macht das (glaub ich) auch so. |
Re: Check ob ein Programm nicht mehr reagiert
schicke die nachticht WM_NULL mittels der API-Funktion
![]() @himitsu: PostMessage wäre etwas blöd. PostMessage stellt die Nachricht in die Nachrichtenschlange und kehrt sofort zurück. Richtige Lösung siehe oben. |
Re: Check ob ein Programm nicht mehr reagiert
Cool. Windows hat das HalteProblem gelöst :mrgreen:
|
Re: Check ob ein Programm nicht mehr reagiert
ich weiß, SendMessage/SendMessageTimeOut springt "sofort" ins Programm, aber was ist, wenn die bearbeitung der Nachrichtenschleife verreckt ist?
SendMessage ist doch unabhängig von diese Schleife ... oder wie war das? :gruebel: |
Re: Check ob ein Programm nicht mehr reagiert
Was für ein Problem?
@himitsu: SendMessage(Timeout) liefert die Nachricht direkt bei der Fensterprozedur ab und wartet bis die Nachricht verarbeitet wurde. Wenn das Programm nicht mehr reagiert, kehrt SendMessageTimeout mit einem entsprechendem Fehlercode zurück, weil es die Nachricht nicht abliefern konnte. Wenn das Programm nicht mehr reagiert, dann werden auch keine Nachrichten abgeholt, das ist richtig. Aber das interessiert PostMessage nicht, da PostMessage die Nachricht in die Nachrichtenschlange stellt und sofort zurückkehrt. Die Nachrichtenschlage wird aber von Windows verwaltet und nicht vom Fenster. |
Re: Check ob ein Programm nicht mehr reagiert
@Luckie
Zitat:
![]() [edit] Link nachgereicht Grüße Klaus |
Re: Check ob ein Programm nicht mehr reagiert
Du hast vergessen den Link einzufügen. ;)
Nach kurzem überfliegen des Wikipediaartikels hat das nichts mit dem Problem zu tun. Letztendlich beobachte ich nur über einem bestimmten Zeitraum einen Zustand. Ändert sich der Zustand über einen definierten Zeitraum nicht, ziehe ich daraus meine Schlussfolgerung. Was ich nicht tue ist, ich entscheide nicht, ob der Zustand ewig daueren oder ob er sich nach einer bestimmten Zeit wieder ändern könnte. Also wieder nur kindsches Microsoft Bashing. |
Re: Check ob ein Programm nicht mehr reagiert
Zitat:
nja, er kann es ja erstma so probieren :angel:
Delphi-Quellcode:
Var hWindow: HWND;
W: LongWord; isHungUp: Boolean; hWindow := FindTask('Freezer.exe'); isHangUp := (hWindow <> 0) and (SendMessageTimeout(hWindow, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 5000, W) = 0); INVALID_HANDLE_VALUE, im Zusammenhang mit Fenstern? |
Re: Check ob ein Programm nicht mehr reagiert
vielen dank für die raschen infos.
allerdings funzt der eben erwähnte code leider nicht! das Programm freezer.exe hat lediglich einen Button der auf Druck folgendes ausführt (endlosschleife)
Delphi-Quellcode:
in der titelleiste steht schon reagiert nicht und cpu auslatung is bei 50% aber isHungUp ist immer True!
procedure TForm1.Button1Click(Sender: TObject);
begin repeat Self.Visible := True; until (1 <> 1); end; edit: Showmessage(SysErrorMessage(GetLastError)); gibt "Ungültiges Menühandle" wieder! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz