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

时间:2016-11-04 16:44:47

标签: wpf excel vba winapi

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

这一切都运行良好,但只是一个小细节:我想将焦点返回到excel仪表板,我有按钮来控制应用程序,在应用程序启动后,实际上,我需要点击电子表格,然后点击任意按钮。

我尝试通过AppActivate Application.ActiveWindow.Caption使用SetForegroundWindowSetFocusWM_IME_SETCONTEXTWM_IME_NOTIFY SendMessage但似乎没有任何效果。我还尝试了工作表Activate方法以及范围Activate方法,但是,在点击按钮之前,我仍然需要点击工作表。

我原以为这是可能的,因为我从excel流程发送邮件,如何激活电子表格?

1 个答案:

答案 0 :(得分:1)

rules governing which objects can set the foreground window没有得到满足,这就是为什么我无法让它发挥作用。

  

系统限制哪些进程可以设置前景窗口。一个   只有在以下情况之一时,进程才能设置前台窗口   条件是真的:

     
      
  • 该过程是前台过程。

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

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

应用程序无法在用户强制窗口到前台   正在使用另一个窗口。相反,Windows会闪烁任务栏   窗口按钮通知用户。

在我的情况下,我试图获得excel来激活自己的一个窗口,但是,衍生的应用程序已经占据了前景焦点,因此excel无法影响前景焦点。解决方案是从VBA向应用程序发送自定义消息,将excel hWnd作为参数,请求前景焦点。然后,应用可以调用SetForegroundWindow,因为它满足上面的第一个条件,excel确实是前景焦点。