我编写了一个基于WPF / C#的“shell”,用于启动WPF应用程序或其他应用程序。
检查流程是否最终完全启动或不再“忙”的最佳方法是什么?我注意到,启动进程的鼠标光标从初始启动时停留在忙碌光标,直到我终于可以看到进程的UI。我可以使用User32.SetCapture API将鼠标捕获设置为外部进程,然后以某种方式检查鼠标光标是否为忙碌光标?或者也许System.Diagnostics.Process类中有一个我不知道的机制?
由于某些已启动的应用程序是预编译的第三方应用程序,如果最终准备就绪,我绝对无法在外部进程中实现消息,例如:Microsoft PowerPoint 2010 Viewer,Adobe Acrobat或Adobe Flash播放器独立。
我不能只检查是否已创建进程,因为那时我有一个空白,无响应的窗口和一个忙碌的光标。我希望在外部进程启动时隐藏我的WPF应用程序。
答案 0 :(得分:1)
WaitForInputIdle Win32 APi函数将等待,直到给定进程进入消息循环(没有输入待处理)。
引用:“在尝试与子进程通信之前,父进程可以使用WaitForInputIdle函数来确定子进程初始化的完成时间。”
您可以通过P / Invoke调用它。
答案 1 :(得分:0)
不是很坚持你的意思是什么意思说“尴尬”,但听到了几个注意事项:
没有已知的(明确的)方式,至少我知道,可以让你做那样的事情。问题是process
是完全孤立的OS内核公民。所以你不能写出适用于所有类型进程的东西,特别是如果它们是第三部分二进制文件。
您可以尝试做什么,获取流程的MainWindow
(如果有),获取其handle
,并过滤OS
消息,直到你得到WM_ACTIVATED
。
但是,即使 在某些情况下可以工作,但在其他情况下,可能会失败。例如,加载了进程但程序未激活,导致出现某种原因导致应用程序License
窗口出现。
让我们看看其他人的建议,在我看来,没有一般的,没有单一的解决方案来涵盖少数可能的案例。
祝你好运