【问题标题】:Launch a WPF app from excel, how to return focus to excel从 excel 启动 WPF 应用程序,如何将焦点返回到 excel
【发布时间】:2016-11-04 16:44:47
【问题描述】:

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

这一切都很好,但有一个小细节:我想将焦点返回到 excel 仪表板,在那里我有控制应用程序的按钮,在应用程序启动后,我需要点击电子表格,然后我才能点击任何按钮。

我尝试通过SendMessage 使用AppActivate Application.ActiveWindow.CaptionSetForegroundWindowSetFocusWM_IME_SETCONTEXTWM_IME_NOTIFY,但似乎没有任何效果。我还尝试了工作表Activate 方法以及范围Activate 方法,但是我仍然必须先单击工作表才能单击按钮。

我原以为这是可能的,因为我正在从 excel 进程发送消息,如何激活电子表格?

【问题讨论】:

  • 你能发布你的shell命令吗?你用vbNormalNoFocus打开shell吗?
  • 嗨@Tim,shell命令只有路径参数。
  • @Tim,我意识到我的评论是模棱两可的:我的意思是我只是用一个参数来称呼它......当我回到办公桌时我会尝试你的建议。
  • @Tim,感谢您的建议,但遗憾的是没有解决问题。当应用程序窗口打开时,它会自行激活并取代 Shell 正在执行的操作。如果您有兴趣,请在下面查看我的答案...

标签: wpf excel vba winapi


【解决方案1】:

rules governing which objects can set the foreground window 没有得到满足,这就是我无法让它工作的原因。

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

  • 进程是前台进程。

  • 进程由前台进程启动。

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

当用户使用时,应用程序不能将窗口强制置于前台 正在使用另一个窗口。相反,Windows 会闪烁任务栏 通知用户的窗口按钮。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多