我的情况:浏览器显示由本地运行的Web服务器提供的网页。当用户单击页面上的按钮时,我想跳到另一个可能已经运行的应用程序。
在Windows上工作时,我考虑过要在本地运行的Web服务器中处理按钮单击,而只是寻找相应的HWND
以便在其上调用SetForegroundWindow
。
不过,就目前而言,是本地运行的Web服务器is not sufficiently privileged to SetForegroundWindow
。这些限制是有道理的,但是我认为单击是一个足以使您跳到另一个应用程序的独特事件。
我了解了一些技术来规避此限制并迫使窗口进入前台:
SetForegroundWindow
赋予足够的特权),其唯一的任务是切换到另一个应用程序:看起来很重,但可能比其他解决方案容易。以上这些都不对我特别有吸引力。我有更好的选择吗?
答案 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 );