C# 过程。响应到底意味着什么?
我正在进行一些工作,其中一个要求是在进程挂起时终止进程。C# 过程。响应到底意味着什么?,c#,winforms,.net-3.5,C#,Winforms,.net 3.5,我正在进行一些工作,其中一个要求是在进程挂起时终止进程。 我的第一个想法是过程。然而,我不确定这到底意味着什么 这是否与Win7在应用程序的窗口标题中添加(无响应)时相同?在我的机器上,即使MS Word试图从速度非常慢的远程共享打开文件,也会发生这种情况 有一个进程的条件是什么?响应可能为false?响应表示应用程序窗口正在响应用户。该进程应该有一个MainWindowHandle,来自: 如果关联进程的用户界面正在响应系统,则为true;否则,错误 如果进程没有MainWindowHandl
我的第一个想法是过程。然而,我不确定这到底意味着什么 这是否与Win7在应用程序的窗口标题中添加
(无响应)
时相同?在我的机器上,即使MS Word试图从速度非常慢的远程共享打开文件,也会发生这种情况
有一个进程的条件是什么?响应可能为false?
响应
表示应用程序窗口正在响应用户。该进程应该有一个MainWindowHandle
,来自:
如果关联进程的用户界面正在响应系统,则为true;否则,错误
如果进程没有MainWindowHandle,则此属性返回true
您可以修改应用程序使用的超时。响应检查。来自
如果进程具有用户界面,则响应属性将联系用户界面以确定该进程是否响应用户输入。如果接口没有立即响应,则响应属性返回false。使用此属性确定关联进程的接口是否已停止响应
在引擎盖下,当您检查
Process.Responding
属性时,将调用Windows函数
此函数基本上向另一个进程的主窗口发送消息,并检查窗口是否在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;
}
这正是它所说的:这始终是一条真正来自技术实现细节的非用户友好消息:消息循环没有响应。注意:它们显式传递5000ms超时。SendMessageTimeout的MSDN页面包含的信息比您的MSDN链接更多,这一页澄清了“如果线程在五秒钟内没有调用GetMessage或类似函数,则此函数认为线程没有响应”——我假设这只影响
SMTO\u abortfhung
标志,这是一个不同的,硬编码的5秒检查。但是,对于已检查的流程应用程序或检查流程的应用程序,这是否存在一些性能问题?