如何检查外部WPF流程或其他流程是否已启动

本文关键字:其他 程是否 是否 启动 WPF 何检查 检查 外部 | 更新日期: 2023-09-27 18:26:07

我已经编写了一个基于WPF/C#的"shell",它可以启动WPF应用程序或其他应用程序。

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

由于一些推出的应用程序是预编译的第三方应用程序,如果它最终准备就绪,我绝对无法在外部流程中实现消息机制,例如:Microsoft PowerPoint 2010 Viewer、Adobe Acrobat或Adobe Flash Player Standalone。

我不能只检查进程是否已经创建,因为这样我就会有一个空白的、未响应的窗口和一个繁忙的光标。我希望在外部进程启动后立即隐藏我的WPF应用程序。

如何检查外部WPF流程或其他流程是否已启动

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

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

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

不太清楚你说"beasy"是什么意思,但有几个注意事项:

至少据我所知,没有已知的(明确的)方法可以让你做这样的事情。问题是process是完全隔离的操作系统内核公民。因此,您不能编写适用于所有类型进程的东西,尤其是当它们是第三部分二进制文件时。

您可以尝试执行的操作是获取进程的MainWindow(如果有),获取其handle,并过滤OS消息,直到您获得例如WM_ACTIVATED

但是,即使这种在某些情况下可以工作,在其他情况下也可能明显失败。例如,进程已加载,但程序未处于活动状态,由于某种原因,出现了应用程序的License窗口。

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

祝好运