2011-07-21 68 views
8

我正在脫身做一些工作,其中一項要求是如果掛起的話會終止進程。
我的第一個想法是Process.Responding,但是,我不確定它的真正含義。Process.Responding是什麼意思?

與Win7在應用程序的窗口標題中添加(Not Responding)是否一樣?在我的機器上,即使MS Word試圖從一個非常慢的遠程共享中打開文件,也會發生這種情況。

讓Process.Responding成爲false是什麼條件?

+1

這正是它說:這一直是那些真正來自非用戶友好的消息之一從技術實現細節:消息循環沒有響應。 – sehe

回答

14

在引擎蓋下,當您檢查Process.Responding屬性時,將調用Windows功能SendMessageTimeout

此功能基本上將消息發送到另一個進程,並檢查該窗口是否被接受的5000毫秒(因此檢查上一個控制檯應用該屬性沒有作用)在超時內的消息的主窗口。

如果你想使用自定義超時你可以和自己調用SendMessageTimeout功能:

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern IntPtr SendMessageTimeout(
    HandleRef hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam, 
    int flags, 
    int timeout, 
    out IntPtr pdwResult); 

const int SMTO_ABORTIFHUNG = 2; 

public bool RespondingWithinMs(Process process, int timeoutMs) 
{ 
    IntPtr ptr2; 
    return SendMessageTimeout(
     new HandleRef(process, process.MainWindowHandle), 
     0, 
     IntPtr.Zero, 
     IntPtr.Zero, 
     SMTO_ABORTIFHUNG, 
     timeoutMs, 
     out ptr2) != IntPtr.Zero; 
} 
+0

[Process.Responding源(https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,953):注意他們在5000毫秒傳遞超時明確。對於SendMessageTimeout [這裏](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(V = vs.85)的.aspx)的MSDN頁面有更多的信息比你的MSDN鏈接,這一個明確了「此功能認爲,一個線程不響應,如果它不叫的GetMessage或五秒鐘之內類似的功能」 - 我認爲這不僅影響了'SMTO_ABORTIFHUNG'標誌,這是一個不同的,硬編碼5秒檢查。 – Quantic

4

Responding表示應用程序窗口正在響應用戶。該過程應具有MainWindowHandlemsdn

真,如果相關聯的過程的用戶界面響應系統;否則,是錯誤的。

如果進程沒有MainWindowHandle,則此屬性返回true。

您可以修改應用程序使用的超時。響應檢查this