判断程序是否无响应

转自《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;

这段代码将集成在应用程序的保护线程内,用于监视程序是否无响应。

posted @ 2014-11-03 22:15  小宇飞刀  阅读(613)  评论(0编辑  收藏  举报