如何判斷一個進程是否停止了響應(有對話框的)

簡介:本文描述了使用C++、VB、Windows API和.Net類庫如何判斷一個進程是否停止了響應。

沒有一個明確的“停止響應”的定義,例如對於Internet Explorer或者Word 2000這樣的多頂層窗口應用程序,可能存在部分頂層窗口失去響應的情況,這時很難定義應用程序是否停止了響應。但是一般來說,很多應用程序只有一個標誌性窗口(或者叫主窗口)。如果主窗口在一段時間內不響應用戶操作的時候,對於用戶來說應用程序是停止響應的(例如在Internet Explorer等待遠程FTP服務器返回登錄結果時)。儘管這經常屬於其他應用程序應該妥善考慮的範疇,但是如果自己的應用程序依賴於這樣的程序而沒有源代碼級控制權,那麼應該提供一個機會允許用戶中斷對外部應用程序的等待或者乾脆終止外部應用程序。

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指明的窗口是否立刻響應來解決的。通過這種方法判斷的缺點是無法設置等待超時的時間。

參考資料
IsHungAppWindow(MSDN)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/ishungappwindow.asp
WM_NULL(MSDN)
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_null.asp
Process.Responding Property (MSDN)
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassRespondingTopic.asp
如何“乾淨地”終止 Win32 中的應用程序
http://support.microsoft.com/kb/178893/zh-cn
How To Detect If an Application Has Stopped Responding
http://support.microsoft.com/kb/231844
304991 Detect if an Application Has Stopped Responding by Using C# 
http://support.microsoft.com/kb/304991
304990 Detect if an Application has Stopped Responding by Using Visual Basic .NET 
http://support.microsoft.com/kb/304990
Get the Main Window, Get EXE Name
 http://msdn.microsoft.com/msdnmag/issues/02/07/CQA/
Enumerating Windows Using API(VB)

http://www.vbaccelerator.com/home/VB/Code/Libraries/Windows/Enumerating_Windows/article.asp


原文地址:http://blog.csdn.net/jiangsheng/article/details/235432

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章