Delphi - Lefagyott az alkalmazás?

forráskód letöltése
Hogyan tudnánk eldönteni egy-egy alkalmazásról programból azt a kérdést, hogy aktuálisan fut-e, vagy már a „Nem válaszol” állapotba került-e?
A megoldás erre igen egyszerű: csak egy Windows függvényt kell meghívni, mely megvizsgálja az általunk kijelölt alkalmazást és egy logikai értékkel tér vissza, melyből megtudhatjuk a választ a kérdésünkre.
A megoldást a User32.dll-ben található IsHungAppWindow függvény szolgáltatja. Ez Windows NT/2000/XP alatt használható. Ha Windows 9x változataiban lenne szükségünk egy ilyen funkcióra, akkor használjuk az IsHungThread függvényt.
function IsHungAppWindow(hwnd: THandle): boolean; stdcall; external 'user32.dll';
function IsHungThread(hwnd: THandle): boolean; stdcall; external 'user32.dll';
A deklaráció megadása után nincs más teendőnk, mint meghívni a megfelelő függvényt. Paraméterként annak az ablaknak az azonosítóját kell átadnunk, melynél ellenőrizni szeretnék, hogy a működése még fenn áll-e. Az ablak azonosító meghatározására több módszert is használhatunk, így például a FindWindow függvénnyel rákereshetünk, de a Delphi-hez adott WinSight32 segédprogrammal is kikereshetjük.
procedure TForm1.Button1Click(Sender: TObject);
const
  a: array[boolean] of string = ('nincs lefagyva', 'nem válaszol');
begin
  Label1.Caption:=a[IsHungAppWindow(StrToInt(Edit1.Text))];
end;