Auf dem lokalen PC kann man eine hängende Anwendung so erkennen:
Delphi-Quellcode:
function IsAppRespondingNT(wnd: HWND): Boolean;
type
TIsHungAppWindow =
function(wnd:hWnd): BOOL;
stdcall;
var
hKernel: THandle;
IsHungAppWindow: TIsHungAppWindow;
begin
Result := True;
hKernel := GetModuleHandle('
user32.dll');
if (hKernel > 0)
then
begin
@IsHungAppWindow := GetProcAddress(hKernel, '
IsHungAppWindow');
if Assigned(IsHungAppWindow)
then
begin
Result :=
not IsHungAppWindow(wnd);
end;
end;
end;
function IsAppResponding(Wnd: HWND): Boolean;
begin
if not IsWindow(Wnd)
then
begin
ShowMessage('
Incorrect window handle');
Exit;
end;
if Win32Platform = VER_PLATFORM_WIN32_NT
then
Result := IsAppRespondingNT(wnd)
else
Result := IsAppRespondingNT(GetWindowThreadProcessId(wnd,
nil));
end;
Um das auf einem fremden PC umzusetzen, würde ich auf die Schnelle einen kleinen Dienst schreiben, der periodisch prüft, ob das Programm läuft und dann per
TCP, Mail, UDP oder sonstwas Bescheid gibt, das was faul ist.
Käme auf einen Versuch an.
Leider ist die Funktion
IsHungAppWindow nur für den internen Gebrauch und vielleicht auch gar nicht mehr so vorhanden.
Ich musste so einen Blödsinn mal schreiben, weil eine Anwendung aufgrund eines schrottigen Treibers manchmal abk*ckte und wir so wenigstens einen KillProcess-Versuch starten konnten. Letztendlich war das alles Blödsinn, aber es hat -soweit ich mich erinnern kann- funktioniert.