从后台进程将窗口带到前台

时间:2019-07-12 09:43:17

标签: windows winapi background-process foreground setforegroundwindow

我的情况:浏览器显示由本地运行的Web服务器提供的网页。当用户单击页面上的按钮时,我想跳到另一个可能已经运行的应用程序。 在Windows上工作时,我考虑过要在本地运行的Web服务器中处理按钮单击,而只是寻找相应的HWND以便在其上调用SetForegroundWindow

不过,就目前而言,是本地运行的Web服务器is not sufficiently privileged to SetForegroundWindow。这些限制是有道理的,但是我认为单击是一个足以使您跳到另一个应用程序的独特事件。

我了解了一些技术来规避此限制并迫使窗口进入前台:

以上这些都不对我特别有吸引力。我有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

首先致电SetForegroundWindow,并与GetForegroundWindow一起检查您是否处于前台状态。

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

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

1。 SwitchToThisWindow,是的“此功能不是一般性用途。在Windows的后续版本中可能会更改或不可用”,等等。

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

没有Sleep,就无法工作。使用TRUE,因为FALSE会隐藏当前的前景窗口。

2。  最小化/还原。动画效果有点烦人。您可以在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 );