如何在Windows中迭代无响应的程序?

时间:2010-02-22 13:54:38

标签: c# winapi

我正在创建一个监视选定程序组的应用程序,并在需要时重新启动它们。如果某些程序“出错”(即需要重新启动),程序将在任务管理器中显示为“无响应”。

有没有办法在使用api的Windows中迭代无响应的程序?或者,如果我有窗口的进程ID或句柄,我可以查询它是否响应?

3 个答案:

答案 0 :(得分:5)

我认为this就是你所追求的目标。

重新发布有效评论,例如:

Process[] processes = Process.GetProcessesByName("your process name");
if(!processes[0].Responding)
 // kill it or do something

答案 1 :(得分:4)

首先,您必须遍历所有顶级窗口。通过调用Win32 EnumWindows来完成此操作。这个函数需要一个回调例程,因此在C#中进行解释很简单。无论如何,请查看文档。

然后在每次迭代时,调用下面的函数传递窗口句柄:

[DllExport("user32.dll")]
static bool IsHungAppWindow(IntPtr theWndHandle);

对于非反应窗口,在窗口上调用此函数应返回true。然后,通过调用GetWindowThreadProcessId来接收流程的ID。

然后获取对流程的引用并退出:

Process aPrc = Process.GetProcessById(aPrcID);
aPrc.Kill();

答案 2 :(得分:2)

通过向应用程序发送消息并检查它是否在几秒钟内得到处理,可以检测到无响应的应用程序。我不知道是否有API调用来执行此操作,但它很容易自行实现。