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

Wod*_*dzu 8 windows delphi winapi 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));
Run Code Online (Sandbox Code Playgroud)

一切正常,但有一个可能的问题: ShellExecuteEx启动应用程序,几乎立即返回.例如,如果App1已正确启动但尚未完成某些内部任务,则可能会出现此问题,但尚未准备好使用.但是ShellExecuteEx已经开始App2,这取决于App1,并且App2不会正确启动,因为它需要完全初始化App1.

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

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

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
Run Code Online (Sandbox Code Playgroud)

但没有任何影响.

启动AppN应用程序后,我有一个处理过程.如果我假设应用程序在创建主窗口后被初始化(所有应用程序都有一个窗口),我可以以某种方式在其消息队列上放置一个钩子并等到WM_CREATE出现或者可能WM_ACTIVATE吗?在存在此类消息的情况下,我的应用程序会知道它可以继续前进.

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

此外,该解决方案必须适用于Windows XP及更高版本.

谢谢你的时间.

编辑

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

Dav*_*nan 13

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

等待指定的进程完成处理其初始输入并等待没有输入挂起的用户输入,或等待超时间隔结束.

  • @Wodzu,坏的答案需要删除.Upvotes不是保留它们的理由.我的记录是删除+7得分的答案:) (2认同)