转自《Delphi超级猛料》
这段代码将集成在应用程序的保护线程内,用于监视程序是否无响应。
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;
这段代码将集成在应用程序的保护线程内,用于监视程序是否无响应。