![怎么判断一个进程是否未响应,第1张 怎么判断一个进程是否未响应,第1张](/aiimages/%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E6%9C%AA%E5%93%8D%E5%BA%94.png)
首先要介绍两个主要的
函数,能够判断目标
进程是否“没有响应”。在User32.dll中(没有文档公开),Win2k/NT下的IsHungAppWindow和Win9X下的IsHungThread;前者是以一个
窗口句柄作为参数,后者是以线程ID作为参数。我们可以通过VC开发工具的Depends查到这两个函数。Windows2000及Windows XP中提供了一个API IsHungAppWindow,但是微软声明此函数可能在后续的Windows版本中删除这个函数。不用遗憾,在Windows 32中有一个特殊的消息WM_NULL,在其文档中说明它可以和SendMessageTimeout一起用于判断某个窗口是否停止了响应。一般来说,我们需要获得进程的标志性窗口(或者叫主窗口)来执行这个判断。2002年7月的MSDN杂志Q&A专栏文章Get the Main Window, Get EXE Name 说明了如何做到这一点。很遗憾,附录中的文章How To Detect If an Application Has Stopped Responding中通过访问浏览器对象的hwnd属性绕过了这个过程,或许是因为在VB中调用EnumWindow比较繁琐;参见附录中的Enumerating Windows Using API(VB)。
另外,.Net Framework中提供了一个Responding属性,可以用于检测进程是否停止了响应。附录中的两篇基于.Net的文章就是检查了这个属性。看起来这似乎是通过检查进程的MainWindowHandle指明的窗口是否立刻响应来解决的。通过这种方法判断的缺点是无法设置等待超时的时间。
评论列表(0条)