我在vba中使用Shell命令来启动应用程序。然后我使用WIN32 API挂钩应用程序,以便我可以控制它。
这一切都运行良好,但只是一个小细节:我想将焦点返回到excel仪表板,我有按钮来控制应用程序,在应用程序启动后,实际上,我需要点击电子表格,然后点击任意按钮。
我尝试通过AppActivate Application.ActiveWindow.Caption
使用SetForegroundWindow
和SetFocus
,WM_IME_SETCONTEXT
和WM_IME_NOTIFY
SendMessage
但似乎没有任何效果。我还尝试了工作表Activate
方法以及范围Activate
方法,但是,在点击按钮之前,我仍然需要点击工作表。
我原以为这是可能的,因为我从excel流程发送邮件,如何激活电子表格?
答案 0 :(得分:1)
rules governing which objects can set the foreground window没有得到满足,这就是为什么我无法让它发挥作用。
系统限制哪些进程可以设置前景窗口。一个 只有在以下情况之一时,进程才能设置前台窗口 条件是真的:
该过程是前台过程。
该过程由前台流程启动。
- 该过程收到了最后一个输入事件。
- 没有前台进程。
- 正在调试该过程。
- 前台进程不是现代应用程序或开始屏幕。
- 未锁定前景(请参阅LockSetForegroundWindow)。
- 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
- 没有菜单处于活动状态。
应用程序无法在用户强制窗口到前台 正在使用另一个窗口。相反,Windows会闪烁任务栏 窗口按钮通知用户。
在我的情况下,我试图获得excel来激活自己的一个窗口,但是,衍生的应用程序已经占据了前景焦点,因此excel无法影响前景焦点。解决方案是从VBA向应用程序发送自定义消息,将excel hWnd作为参数,请求前景焦点。然后,应用可以调用SetForegroundWindow
,因为它满足上面的第一个条件,excel确实是前景焦点。