解决多显示器设置中使用 WS_POPUP 窗口的异常行为
2024-03-12 05:33:47
多显示器设置中 WS_EX_NOACTIVATE 对 SetWindowPos 的影响
问题
在多显示器设置中,当主窗口位于辅助显示器时,使用 WS_POPUP
样式的窗口在尺寸和位置上会出现异常行为。
原因分析
此问题是由 WS_EX_NOACTIVATE
窗口扩展样式引起的。此样式指示窗口在创建时不激活。当主窗口位于主显示器上时,WS_POPUP
窗口可以正常显示,因为它是子窗口,不会影响主窗口的激活状态。
但是,当主窗口位于辅助显示器上时,WS_POPUP
窗口会影响主窗口的激活状态。Windows 会自动激活在辅助显示器上创建的窗口。由于 WS_EX_NOACTIVATE
样式,WS_POPUP
窗口无法激活,从而导致 Windows 尝试激活主窗口,进而引发 WS_POPUP
窗口尺寸和位置的变化。
解决方案
解决此问题的关键在于在创建 WS_POPUP
窗口时添加 SWP_NOACTIVATE
标志。此标志指示 Windows 在设置窗口位置时不激活窗口。这样,WS_POPUP
窗口就可以在辅助显示器上正确创建和放置,而不会影响主窗口的激活状态。
代码示例
window->Create(nullptr, "Title", WS_POPUP, WS_EX_TOPMOST | WS_EX_TOOLWINDOW | SWP_NOACTIVATE);
SetWindowPos(GetHWND(), NULL, x, y, widnow_height, window_height, SWP_NOZORDER | SWP_NOACTIVATE);
ShowWindow();
结论
通过在创建 WS_POPUP
窗口时添加 SWP_NOACTIVATE
标志,可以解决多显示器设置中出现的窗口异常行为。此标志指示 Windows 在设置窗口位置时不激活窗口,避免了对主窗口激活状态的干扰。
常见问题解答
-
为什么
WS_EX_NOACTIVATE
会导致窗口异常行为?
WS_EX_NOACTIVATE
样式指示窗口在创建时不激活。当主窗口位于辅助显示器上时,WS_POPUP
窗口会影响主窗口的激活状态,因为 Windows 会自动激活在辅助显示器上创建的窗口。 -
如何解决此问题?
在创建WS_POPUP
窗口时添加SWP_NOACTIVATE
标志。此标志指示 Windows 在设置窗口位置时不激活窗口。 -
WS_POPUP
窗口和子窗口有什么区别?
子窗口是父窗口的一部分,而WS_POPUP
窗口是一个独立的窗口。子窗口不会影响父窗口的激活状态,而WS_POPUP
窗口可能会影响父窗口的激活状态。 -
为什么添加
SWP_NOACTIVATE
标志后窗口行为会发生变化?
SWP_NOACTIVATE
标志指示 Windows 在设置窗口位置时不激活窗口。这避免了对主窗口激活状态的干扰,使WS_POPUP
窗口可以在辅助显示器上正确创建和放置。 -
其他避免窗口异常行为的建议?
除了添加SWP_NOACTIVATE
标志外,还可以使用WS_EX_NOACTIVATE
窗口扩展样式,以防止窗口在创建时激活。