我正在炮轰做一些工作,其中一个要求是如果它被挂起就要终止这个过程 我的第一个想法是Process.Responding,但是,我不确定它的真正含义。
是否与Win7在应用程序的窗口标题中添加(Not Responding)
时相同?在我的机器上,即使MS Word尝试从非常慢的远程共享中打开文件,也会发生这种情况。
将Process.Responding设为false是什么条件?
答案 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
表示应用程序窗口正在响应用户。该流程应具有msdn的MainWindowHandle
:
如果关联进程的用户界面正在响应系统,则为true;否则,错误。
如果进程没有MainWindowHandle,则此属性返回true。
您可以修改application.Responding check this。
使用的超时答案 2 :(得分:3)
来自http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx
如果进程具有用户界面,则Responding属性会联系用户界面以确定进程是否响应用户输入。如果接口没有立即响应,则Responding属性返回false。使用此属性可确定关联进程的接口是否已停止响应。