http://www.cnblogs.com/smallmuda/archive/2009/07/24/1529845.html

delphi 如何判断应用程序未响应

 
 今天在MSN的核心讨论组上看到两篇文章.讨论的乃是应用程序是否没有响应.原文如下:     
    
  >   How   is   it   possible   to   determine   a   process   is   "not   responding"   like   NT   Task     
  >   Manager   do?     
  The   heuristic   works   only   for   GUI   processes,   and   consists   of   calling     
  SendMessageTimeOut()   with   SMTO_ABORTIFHUNG.     
    
  >There   is   any   API   call   to   do   the   job,   or   this   status   is   simply   a   deduction     
  >based   on   process   counters,   like   that   returned   from   call   to   GetProcessTimes     
  >API   function?     
    
  Use   SendMessageTimeout   with   a   value   of   WM_NULL.   That's   all   Task     
  Manager   does   to   determine   this   AFAIK.     
    
  --     
  有理有理.当然,我这里还有一个UNDOCUMENTED函数,乃是其他的解决方案,NT和9X有个USER32.DLL的函数,IsHungAppWindow(NT)和IsHungThread(9X).使用起来简便无比.下面给出原型.     
  BOOL   IsHungAppWindow   (     
  HWND   hWnd,   //   handle   to   main   app's   window     
  );     
    
  BOOL   IsHungThread   (     
  DWORD   dwThreadId,   //   The   thread's   identifier   of   the   main   app's   window     
  );     
  有了原型,连解释都不需要,好得不的了.:)不过调用时需要GetProcAddress.库里没有该函数.     
  ****************************************   
  check   whether   an   application   (window)   is   not   responding?   
    
  {1.   The   Documented   way}     
    
  {     
      An   application   can   check   if   a   window   is   responding   to   messages   by     
      sending   the   WM_NULL   message   with   the   SendMessageTimeout   function.     
  }     
    
  function   AppIsResponding(ClassName:   string):   Boolean;     
  const     
      {   Specifies   the   duration,   in   milliseconds,   of   the   time-out   period   }     
      TIMEOUT   =   50;     
  var     
      Res:   DWORD;     
      h:   HWND;     
  begin     
      h   :=   FindWindow(PChar(ClassName),   nil);     
      if   h   <>   0   then     
          Result   :=   SendMessageTimeOut(H,     
              WM_NULL,     
              0,     
              0,     
              SMTO_NORMAL   or   SMTO_ABORTIFHUNG,     
              TIMEOUT,     
              Res)   <>   0     
      else     
          ShowMessage(Format('%s   not   found!',   [ClassName]));     
  end;     
    
  procedure   TForm1.Button1Click(Sender:   TObject);     
  begin     
      if   AppIsResponding('OpusApp')   then     
          {   OpusApp   is   the   Class   Name   of   WINWORD.EXE   }     
          ShowMessage('App.   responding');     
  end;     
    
  {2.   The   Undocumented   way}     
    
  {     
      //   Translated   form   C   to   Delphi   by   Thomas   Stutz     
      //   Original   Code:     
      //   (c)1999   Ashot   Oganesyan   K,   SmartLine,   Inc     
      //   mailto:ashot@aha.ru,   http://www.protect-me.com,   http://www.codepile.com     
    
    The   code   doesn't   use   the   Win32   API   SendMessageTimout   function   to     
    determine   if   the   target   application   is   responding   but   calls     
    undocumented   functions   from   the   User32.dll.     
    
    -->   For   Windows   95/98/ME   we   call   the   IsHungThread()   API     
    
    The   function   IsHungAppWindow   retrieves   the   status   (running   or   not   responding)     
    of   the   specified   application     
    
    IsHungAppWindow(Wnd:   HWND):   //   handle   to   main   app's   window     
    BOOL;     
    
    -->   For   NT/2000/XP   the   IsHungAppWindow()   API:     
    
    The   function   IsHungThread   retrieves   the   status   (running   or   not   responding)   of     
    the   specified   thread     
    
    IsHungThread(DWORD   dwThreadId):   //   The   thread's   identifier   of   the   main   app's   window     
    BOOL;     
    
    Unfortunately,   Microsoft   doesn't   provide   us   with   the   exports   symbols   in   the     
    User32.lib   for   these   functions,   so   we   should   load   them   dynamically   using   the     
    GetModuleHandle   and   GetProcAddress   functions:     
  }     
    
  //   For   Win9X/ME     
  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;     
    
  //   For   Win   NT/2000/XP     
  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;     
    
  //   Example:   Check   if   Word   is   hung/responding     
    
  procedure   TForm1.Button3Click(Sender:   TObject);     
  var     
      Res:   DWORD;     
      h:   HWND;     
  begin     
      //   Find   Word   by   classname     
      h   :=   FindWindow(PChar('OpusApp'),   nil);     
      if   h   <>   0   then     
      begin     
          if   IsAppRespondig(h)   then     
              ShowMessage('Word   is   responding!')     
          else     
              ShowMessage('Word   is   not   responding!');     
      end     
      else     
          ShowMessage('Word   is   not   open!');     
  end;     

delphi 如何判断应用程序未响应的更多相关文章

  1. win7系统程序未响应怎么办

    问题描述:出现“程序未响应...”而后系统程序就没有反应了. 解决方案:1.运行→输入“regedit”→hkey_current_usser/control panel/desktop/window ...

  2. Windows应用程序未响应

    昨天在安装postgresql的扩展功能postgis的时候,stackbuilder刚打开就死掉,一直未响应,刚开始以为是内存的原因,后来发现并没有占用太多内存,最后打开vpn发现就可以了,原来是网 ...

  3. 【转】VS2013 C#WinForm程序构造界面拖动控件NumericUpDown时"未响应“是有道词典惹的祸

    很久之前遇到过因为金山词霸和其他软件冲突导致的程序无响应的情况. 没想到今天情况重现,VS2013在可视化编辑NumbericUpDown控件的时候,又出现了”未响应“,发现又是有道词典惹的祸. 可见 ...

  4. 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)

    正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...

  5. Delphi如何处理在进行大量循环时,导致的应用程序没有响应的情况

    一般用在比较费时的循环中,往往导致应用程序没有响应,此时在比较费时的程序体中加入Application.ProcessMessages即可解决,该语句的作用是检查并先处理消息队列中的其他消息. 例如, ...

  6. 关于Qt Designer程序/UI文件打开未响应的解决方法

    最近完成一个项目,到最后关头用QtCreator无法打开UI文件,每次都未响应,用QtDesigner也无法启动 这个问题把我折磨了半天,最后才知道原来是要删除C:\Users\Administrat ...

  7. [转]Delphi中,让程序只运行一次的方法

    program onlyRunOne; uses Forms,Windows,SysUtils, Dialogs, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} v ...

  8. timeout Timeout时间已到.在操作完成之前超时时间已过或服务器未响应

    Timeout时间已到.在操作完成之前超时时间已过或服务器未响应 问题 在使用asp.net开发的应用程序查询数据的时候,遇到页面请求时间过长且返回"Timeout时间已到.在操作完成之间超 ...

  9. 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider)

    超时时间已到.在操作完成之前超时时间已过或服务器未响应. (.Net SqlClient Data Provider) 在做一个小东西的时候出现了这个问题,就是使用VS调试几次项目后,使用SQL Se ...

随机推荐

  1. Linux基础 - crontab

    列出当前用户设置的定时任务 crontab -l 编辑定时任务 crontab -e 用法 m h dom mon dow * * * * * command 字段详解: *:any m: minut ...

  2. virtualenv,virtualenvwrapper安装及使用

    1.安装 # 安装: (sudo) pip install virtualenv virtualenvwrapper # centos7下 pip install virtualenv virtual ...

  3. ROS二进制日志包 ROS binary logger package

    原文网址: 1 http://www.ros.org/news/2017/02/ros-binary-logger-package.html 2 https://github.com/CNR-ITIA ...

  4. Python学习笔记:lambda表达式

    lambda表达式:通常是在需要一个函数,但又不想去命名一个函数的时候使用,即匿名函数. 示例如下: add = lambda x,y : x+ y add(1,2) # 结果为3 1.应用在函数式编 ...

  5. 【剑指Offer面试题】 九度OJ1389:变态跳楼梯

    转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...

  6. Spark介绍及安装部署

    一.Spark介绍 1.1 Apache Spark Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架(没有数据存储).最初在2009年由加州大学伯克利分校的AMPLab开 ...

  7. 按书上学写测试pytest

    慢慢的,这块知识也补好吧. 系统的学习框架,具体的细节,可以边百度边实现. test_three.py '''Test the Task data type.''' from collections ...

  8. HTML5 Canvas游戏开发(三)lufylegend开源库件(上)

    lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...

  9. PHP学习日记 Windows配置PHP+Nginx+自动化脚本

    Windows配置PHP+Nginx+自动化脚本 安装与配置 PHP 下载PHP:传送门 选择合适的版本下载 尽量选Thread Safe 配置PHP: 解压后在文件夹中找到php.ini-devel ...

  10. jQuery的data() 和 h5 的 dataset()

    作用:获取自定义属性 命名规则:驼峰命名法  data-user==>user data-user-name==>userName 区别:jQuery:操作内存   h5: 操作DOM j ...