用ShellExecuteEx启动外部应用程序并等待,直到它初始化

我有一个应用程序需要运行链中的其他几个应用程序。 我通过ShellExecuteEx运行它们。 运行每个应用程序的顺序非常重要,因为它们彼此依赖。 例如:

 Start(App1); If App1.IsRunning then Start(App2); If App2.IsRunning then Start(App3); ......................... If App(N-1).IsRunning then Start(App(N)); 

一切工作正常,但有一个可能的问题: ShellExecuteEx启动应用程序,并立即返回。 例如,当App1已经正确启动,但尚未完成一些内部任务时,可能会出现问题,但尚未准备好使用。 但是ShellExecuteEx已经启动了依赖于App1 App2 ,并且App2将无法正常启动,因为它需要完全初始化App1

请注意,我不想等待App(N-1)完成,然后启动AppN

我不知道这是否可以用ShellExecuteEx解决,我试过使用

 SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC; 

但没有任何影响。

启动AppN应用程序后,我有一个处理过程。 如果我假设应用程序在创build主窗口(所有应用程序都有一个窗口)后初始化,我可以以某种方式在其消息队列中放置一个钩子,并等待直到WM_CREATE出现或者可能是WM_ACTIVATE ? 在这样的信息的情况下,我的应用程序将知道它可以继续前进。

这只是一个想法。 但是,我不知道如何把这个钩子。 所以,如果你能帮助我,或者你有一个更好的主意,这将是伟大的:)

此外,该解决scheme必须在Windows XP及更高版本上运行。

谢谢你的时间。

编辑

@Cosmic Prund:我不明白你为什么删除你的答案? 我可能会尝试你的想法…

您可能可以通过调用ShellExecute()返回的每个进程句柄上的WaitForInputIdle()来实现所需的功能。

等待指定的过程完成其初始输入的处理,并等待用户输入未挂起输入,或等到超时间隔过去。

如果您的应用程序有一些自定义的初始化逻辑不能在UI线程中运行,那么WaitForInputIdle可能没有帮助。 在这种情况下,您需要一个机制来指示您已完成初始化的以前的应用程序。

对于信号,您可以使用命名管道,套接字,一些RPC机制或基于文件的简单锁定。

您始终可以使用IPC和Interpocess Synchronization使您的应用程序与其他应用程序(如果需要的话)进行通信(只要您需要)。