将窗口从后台进程置于前台



我的情况:浏览器显示由本地运行的Web服务器提供的网页。当用户单击页面上的按钮时,我想跳转到另一个可能已经在运行的应用程序。 在Windows上工作时,我想到了在本地运行的Web服务器中处理按钮单击,然后查找相应的HWND来调用SetForegroundWindow

但是,就目前而言,本地运行的Web服务器没有足够的特权来SetForegroundWindow。这些限制是有道理的,但我认为点击是一个足够独特的事件,可以证明跳转到另一个应用程序是合理的。

我读到了某些技术来规避此限制并强制将窗口引入前台:

  • AttachThreadInput:似乎是一个坏主意。
  • 发送热键:似乎由 Chromium 项目使用,但涉及创建自己的消息循环。它的作者指出它可能是一个Windows错误(即使旧的新事物在没有明确警告的情况下提到它)。此外,如果另一个已调用的应用程序注册了此热键,则它无法可靠地工作。
  • 启动一个独立的包装器(从而希望给它足够的权限来SetForegroundWindow),其唯一任务是切换到另一个应用程序: 看起来很重量级,但可能比其他解决方案更容易。

以上这些看起来都不是特别吸引我。我有更好的选择吗?

第一次调用SetForegroundWindowGetForegroundWindow检查您是否获得了前台状态。

如果没有,可以检查鼠标按钮是否按下或按下 Alt、Ctrl、Shift 或 Windows 键。在这种情况下,您不应该中断用户操作(例如拖放)。

当您决定继续时,除了热键方法之外,您还有两个可行的解决方案:

1.SwitchToThisWindow, 是的 "此功能不适用于一般用途。它可能在Windows的后续版本中被更改或不可用"等,但它可以工作。

SwitchToThisWindow( hwnd, TRUE );
Sleep( 100 );
SetForegroundWindow( hwnd );

没有Sleep就不起作用.使用 TRUE,因为 FALSE 会遮挡当前前景窗口。

阿拉伯数字。 最小化/恢复。动画效果有点烦人。您可以在 DWM 处于活动状态时关闭动画

BOOL    flag = TRUE;
DwmSetWindowAttribute( hwnd, DWMWA_TRANSITIONS_FORCEDISABLED, &flag, sizeof(flag) );
ShowWindow( hwnd, SW_MINIMIZE );
ShowWindow( hwnd, SW_RESTORE );
flag = FALSE;
DwmSetWindowAttribute( hwnd, DWMWA_TRANSITIONS_FORCEDISABLED, &flag, sizeof(flag) );
SetForegroundWindow( hwnd );

最新更新