所以是的,我发现自己处于一个可疑的位置,即执行SwitchToThisWindow
调用迫使我的窗户向前移动。我同意,它并不理想,但并不总是可以反对其他人认为必要的产品“功能”。
现在,我认为SwitchToThisWindow
胜过AttachThreadInput
黑客进行强制窗口切换,因为它不太可能死锁,应该SwitchToThisWindow
被删除,或者停止功能我不会抱怨。
但是,SwitchToThisWindow
除了在为fAltTab参数传递FALSE时将目标窗口置于顶部时,还有将当前前景窗口推到z序列底部的不幸副作用,而不是如果TRUE通过则执行任何操作。
如何在不诉诸AttachThreadInput
的情况下避免“将当前活动推送到z-bottom”行为?
或者,MS可以删除AttachThreadInput
作为可行的解决方法,我可以告诉我的经理,实际上,实际上是不可能的。
答案 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。
问题是,你真的需要键盘焦点吗?
让我建议另一种选择:
SetForegroundWindow
以闪烁任务栏按钮(或FlashWindowEx
)这应该避免用户正在键入的情况,并且甚至在用户界面中执行某些操作时甚至不看屏幕。
修改强>
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()
。