function IsAppRespondig9X(dwThreadId: DWORD): Boolean; type TIsHungThread = function(dwThreadId: DWORD): BOOL; stdcall; var hUser32: THandle; IsHungThread: TIsHungThread; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hUser32 > 0) then begin @IsHungThread := GetProcAddress(hUser32, 'IsHungThread'); if Assigned(IsHungThread) then begin Result := not IsHungThread(dwThreadId); end; end; end; function IsAppRespondigNT(wnd: HWND): Boolean; type TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall; var hUser32: THandle; IsHungAppWindow: TIsHungAppWindow; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hUser32 > 0) then begin @IsHungAppWindow := GetProcAddress(hUser32, 'IsHungAppWindow'); if Assigned(IsHungAppWindow) then begin Result := not IsHungAppWindow(wnd); end; end; end; function IsAppRespondig(Wnd: HWND): Boolean; begin if not IsWindow(Wnd) then begin ShowMessage('Incorrect window handle!'); Exit; end; if Win32Platform = VER_PLATFORM_WIN32_NT then Result := IsAppRespondigNT(wnd) else Result := IsAppRespondig9X(GetWindowThreadProcessId(Wnd,nil)); end; procedure TForm1.Button1Click(Sender: TObject); var Res: DWORD; h: HWND; begin h := FindWindow(nil, 'notepad'); if h > 0 then begin if IsAppRespondig(h) then ShowMessage('notepad 有响应') else ShowMessage('notepad 无响应'); end else ShowMessage('未打开 notepad'); end;
这段代码将集成在应用程序的保护线程内,用于监视程序是否无响应。