检测外部进程是否交互式,并有任何可见的用户界面

我似乎无法find一种方法来确定一个Process是否有一个用户界面,例如一个窗口,这是用户可见的?

  • Environment.UserInteractive对外部进程没有用处
  • process.MainWindowHandle != IntPtr.Zero似乎总是在我的testing中返回false?

我想区分说Notepad和conhost

  1. Process实例中找出进程ID。
  2. EnumWindows枚举顶级窗口。
  3. 调用GetWindowThreadProcessId并查看它是否匹配目标PID。
  4. 调用IsWindowVisible和/或IsIconic来测试该窗口是否对用户可见。

有关System.Diagnostics.Process.MainWindowHandle的MSDN文章声明如下

如果你刚开始一个进程并想使用它的主窗口句柄,可以考虑使用WaitForInputIdle方法来让进程完成启动,确保主窗口句柄已经被创建。 否则,将抛出异常。

他们暗示的是,在调用MainWindowHandle之后, Window可能需要几秒钟的时间才能显示,即使您可以清楚地看到一个Window ,也会返回IntPtr.Zero

请参阅https://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainwindowhandle(v=vs.110).aspx以供参考