我的具体问题:我需要开发一个需要保持各种应用程序运行的看门狗应用程序。我正在使用 Visual Studio 和支持 .net 4.0 的 windows 环境,因为我没有创建这些应用程序,而且我无权以任何方式修改它们,所以我只能依赖 windows 提供的信息。
在过去的一周里,我一直在努力寻找确切的方法来获取应用程序的任务管理器中显示的“无响应”属性。
我尝试过: 1 使用系统诊断,获取过程信息并解释其中的信息。问题是,当应用程序停止工作(崩溃)时,进程仍在运行,JIT Debugger 消息会弹出并报告应用程序崩溃。在这个特定时刻,任务管理器报告应用程序“无响应”,但进程信息(尽管它有一个主窗口句柄)的属性 Responding 设置为“true”。我发现很多开源任务管理器(前 5 名)都使用“响应”属性来确定应用程序是否正在运行。所以问题是:任务管理器显示没有响应,进程属性响应 = True,这种确定应用程序是否没有响应的方法是无效的
2 向主窗口处理程序发送超时消息。我使用了 SendMessageTimeout 函数 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx *我使用了 SMTO_ABORTIFHUNG、SMTO_BLOCK、SMTO_NORMAL、SMTO_NOTIMEOUTIFNOTHUNG 和 SMTO_ERROR同样的问题: - 应用程序崩溃之前:报告正在运行(所有消息返回 1) - 应用程序崩溃之后(JIT 调试器弹出报告应用程序崩溃并在任务管理器中显示“未响应”)所有上述消息发送到进程窗口处理程序返回 1。所以这种确定应用程序是否没有响应的方法也是无效的
我很惊讶我无法找到与我的问题相关的资源。
这是我尝试过的一些代码:
bool IsResponding(Process process)
{
HandleRef handleRef = new HandleRef(process, process.MainWindowHandle);
int timeout = 2000;
IntPtr lpdwResult;
IntPtr lResult = SendMessageTimeout(
handleRef,
0,
IntPtr.Zero,
IntPtr.Zero,
1,
1000,
out lpdwResult);
lResult = SendMessageTimeout(
handleRef,
0,
IntPtr.Zero,
IntPtr.Zero,
2,
1000,
out lpdwResult); …Run Code Online (Sandbox Code Playgroud)