如何检查外部WPF进程或其他进程是否已完成启动?

时间:2012-02-27 19:38:58

标签: c# wpf winforms process pinvoke

我编写了一个基于WPF / C#的“shell”,用于启动WPF应用程序或其他应用程序。

检查流程是否最终完全启动或不再“忙”的最佳方法是什么?我注意到,启动进程的鼠标光标从初始启动时停留在忙碌光标,直到我终于可以看到进程的UI。我可以使用User32.SetCapture API将鼠标捕获设置为外部进程,然后以某种方式检查鼠标光标是否为忙碌光标?或者也许System.Diagnostics.Process类中有一个我不知道的机制?

由于某些已启动的应用程序是预编译的第三方应用程序,如果最终准备就绪,我绝对无法在外部进程中实现消息,例如:Microsoft PowerPoint 2010 Viewer,Adobe Acrobat或Adobe Flash播放器独立。

我不能只检查是否已创建进程,因为那时我有一个空白,无响应的窗口和一个忙碌的光标。我希望在外部进程启动时隐藏我的WPF应用程序。

2 个答案:

答案 0 :(得分:1)

WaitForInputIdle Win32 APi函数将等待,直到给定进程进入消息循环(没有输入待处理)。

引用:“在尝试与子进程通信之前,父进程可以使用WaitForInputIdle函数来确定子进程初始化的完成时间。”

您可以通过P / Invoke调用它。

答案 1 :(得分:0)

不是很坚持你的意思是什么意思说“尴尬”,但听到了几个注意事项:

没有已知的(明确的)方式,至少我知道,可以让你做那样的事情。问题是process是完全孤立的OS内核公民。所以你不能写出适用于所有类型进程的东西,特别是如果它们是第三部分二进制文件。

您可以尝试做什么,获取流程的MainWindow(如果有),获取其handle,并过滤OS消息,直到你得到WM_ACTIVATED

但是,即使 在某些情况下可以工作,但在其他情况下,可能会失败。例如,加载了进程但程序未激活,导致出现某种原因导致应用程序License窗口出现。

让我们看看其他人的建议,在我看来,没有一般的,没有单一的解决方案来涵盖少数可能的案例。

祝你好运