Process.Responding真正意味着什么?

时间:2011-07-21 19:47:13

标签: c# winforms .net-3.5

我正在炮轰做一些工作,其中一个要求是如果它被挂起就要终止这个过程 我的第一个想法是Process.Responding,但是,我不确定它的真正含义。

是否与Win7在应用程序的窗口标题中添加(Not Responding)时相同?在我的机器上,即使MS Word尝试从非常慢的远程共享中打开文件,也会发生这种情况。

将Process.Responding设为false是什么条件?

3 个答案:

答案 0 :(得分:15)

当您检查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;
}

答案 1 :(得分:4)

Responding表示应用程序窗口正在响应用户。该流程应具有msdnMainWindowHandle

  

如果关联进程的用户界面正在响应系统,则为true;否则,错误。

     

如果进程没有MainWindowHandle,则此属性返回true。

您可以修改application.Responding check this

使用的超时

答案 2 :(得分:3)

来自http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx

  

如果进程具有用户界面,则Responding属性会联系用户界面以确定进程是否响应用户输入。如果接口没有立即响应,则Responding属性返回false。使用此属性可确定关联进程的接口是否已停止响应。