SwitchToThisWindow将当前窗口发送到后面

时间:2011-02-02 07:37:12

标签: windows winapi

所以是的,我发现自己处于一个可疑的位置,即执行SwitchToThisWindow调用迫使我的窗户向前移动。我同意,它并不理想,但并不总是可以反对其他人认为必要的产品“功能”。

现在,我认为SwitchToThisWindow胜过AttachThreadInput黑客进行强制窗口切换,因为它不太可能死锁,应该SwitchToThisWindow被删除,或者停止功能我不会抱怨。

但是,SwitchToThisWindow除了在为fAltTab参数传递FALSE时将目标窗口置于顶部时,还有将当前前景窗口推到z序列底部的不幸副作用,而不是如果TRUE通过则执行任何操作。

如何在不诉诸AttachThreadInput的情况下避免“将当前活动推送到z-bottom”行为?

或者,MS可以删除AttachThreadInput作为可行的解决方法,我可以告诉我的经理,实际上,实际上是不可能的。

3 个答案:

答案 0 :(得分:6)

我不知道这是否有帮助,但我发现可靠地将窗户置于最高位置的唯一方法是拨打以下2个电话:

ShowWindow(myhwnd, SW_MINIMIZE);
ShowWindow(myhwnd, SW_RESTORE);

显然,当您的窗口当前不是最顶层的窗口时,应该进行这些调用以避免闪烁。但是这也不应该具有将当前前窗置于z顺序底部的副作用。

答案 1 :(得分:2)

传递fAltTab=FALSE时,实际上是在模拟Alt + Esc。因此,您可以在SetWindowPos调用后使用hWndInsertAfter及其SwitchToThisWindow撤消此z顺序更改,但之后您又回到丑陋的hacky-land IMHO。

问题是,你真的需要键盘焦点吗?

让我建议另一种选择:

  1. 如果您的窗口已最小化,请将其还原
  2. 将窗口设置为最顶层,激活窗口后再次删除样式。
  3. 致电SetForegroundWindow以闪烁任务栏按钮(或FlashWindowEx
  4. 这应该避免用户正在键入的情况,并且甚至在用户界面中执行某些操作时甚至不看屏幕。

    修改

    HWND hwndFgnd=GetForegroundWindow();
    SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
    SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
    
    如果你不想在任何一点设置最高位,那么

    ..可能会有效(即使你的窗口位于z顺序的顶部,你仍然无法合法地获得焦点{{1 }})

答案 2 :(得分:0)

这也是我遇到的一个不好的问题。请参阅我的解决方案here。它适用于Show()ShowDialog()