从Excel启动一个WPF应用程序,如何将焦点返回到Excel
我在vba中使用Shell命令来启动一个应用程序。 然后,我使用WIN32 API挂接应用程序,以便可以控制它。
这一切都工作正常,但一个小细节:我想返回焦点到Excel的仪表板,在那里我有button来控制应用程序,启动后,实际上,我需要点击电子表格之前我可以点击任何button。
我已经尝试通过SendMessage
使用AppActivate Application.ActiveWindow.Caption
和SetForegroundWindow
, SetFocus
和WM_IME_SETCONTEXT
与WM_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确实给予前景焦点。