我正在创建一个监视选定程序组的应用程序,并在需要时重新启动它们。如果某些程序“出错”(即需要重新启动),程序将在任务管理器中显示为“无响应”。
有没有办法在使用api的Windows中迭代无响应的程序?或者,如果我有窗口的进程ID或句柄,我可以查询它是否响应?
答案 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调用来执行此操作,但它很容易自行实现。