从Excel启动一个WPF应用程序,如何将焦点返回到Excel

我在vba中使用Shell命令来启动一个应用程序。 然后,我使用WIN32 API挂接应用程序,以便可以控制它。

这一切都工作正常,但一个小细节:我想返回焦点到Excel的仪表板,在那里我有button来控制应用程序,启动后,实际上,我需要点击电子表格之前我可以点击任何button。

我已经尝试通过SendMessage使用AppActivate Application.ActiveWindow.CaptionSetForegroundWindowSetFocusWM_IME_SETCONTEXTWM_IME_NOTIFY ,但似乎没有任何工作。 我也尝试了工作表Activate方法以及Range Activate方法,但是在点击button之前,我仍然需要点击工作表。

我会认为这是可能的,因为我从Excel过程中发送消息,我怎样才能激活电子表格?

pipe理哪些对象可以设置前景窗口的规则没有得到满足,这就是为什么我不能得到它的工作。

系统限制哪些进程可以设置前台窗口。 只有满足以下条件之一时,进程才可以设置前景窗口:

  • 该过程是前台进程。

  • 该过程由前台进程启动。

  • 该进程收到最后一个input事件。
  • 没有前台进程。
  • 该进程正在被debugging。
  • 前台进程不是现代应用程序或开始屏幕。
  • 前景未被locking(请参阅LockSetForegroundWindow)。
  • 前台locking超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 没有菜单处于活动状态

当用户使用另一个窗口时,应用程序不能强制窗口到前台。 相反,Windows会闪烁窗口的任务栏button以通知用户。

在我的情况下,我试图让excel激活自己的一个窗口,但产生的应用程序已经接pipe了前景焦点,所以excel无力影响前景焦点。 解决的办法是从VBA发送一个自定义消息到应用程序,以excel hWnd作为参数,请求前景焦点。 应用程序然后可以调用SetForegroundWindow ,因为它满足上面的第一个条件,Excel确实给予前景焦点。