移动到其他屏幕时,MoveWindow 不会缩放窗口

MoveWindow does not scale the window when moving to a different screen

提问人:A9S6 提问时间:9/25/2021 最后编辑:Remy LebeauA9S6 更新时间:9/28/2021 访问量:384

问:

我有一个带有浮动窗口的 Windows 应用程序。我在多显示器设置(FHD、4K)上运行它。应用程序被标记为系统感知,因此我们选择主监视器的当前 DPI 值,并根据该值进行缩放。之后,操作系统位图对其进行缩放。该应用程序在 Windows 10 上运行。

现在,当其中一个浮动窗口被拖动到另一个监视器上时,操作系统会自动缩放它,一切正常。

问题是我们有一些没有标题栏的窗口,我们有代码可以通过从窗口的工作区拖动来移动这些窗口。松开鼠标后,我们调用 API 将窗口移动到目标位置。这在单个显示器上工作正常,但是当我们将窗口放在另一台显示器上时,它不会按位图缩放,它似乎失去了放置位置。操作系统似乎只有当我们通过标题栏拖动窗口时才会按位图缩放,而不是以编程方式移动时。MoveWindow()

关于以编程方式移动窗口时如何实现这种自动缩放的任何想法?

C++ WinAPI 缩放 多监视器 MoveWindow

评论

0赞 IInspectable 9/25/2021
为什么不处理没有标题栏的窗口,返回 ,并让系统处理其他所有事情?WM_NCHITTESTHTCAPTION
0赞 A9S6 9/25/2021
这些浮动窗口实际上是使用无标题窗口创建的自定义可停靠工具栏。跟踪鼠标移动以查看它是否会停靠在当前位置。它都是现有的旧代码,我试图弄清楚为什么手动拖动会缩放窗口,而 MoveWindow 却没有。
0赞 A9S6 9/26/2021
即使处理窗口也不会缩放。我看到的唯一改进是它不会奇怪地跳到不同的位置。我之前曾尝试模拟 on a 并模拟了拖动,但移动到另一个屏幕时窗口仍然没有缩放WM_NCHITTESTWM_NCLBUTTONDOWNWM_LBUTTONDOWN
0赞 Remy Lebeau 9/26/2021
让操作系统为您拖动无标题窗口的另一种方法是使用未记录但已知的 (0xF012) 命令向窗口发送消息。WM_SYSCOMMANDSC_DRAGMOVE
0赞 Hans Passant 9/26/2021
确保您要求 PMv2

答:

0赞 A9S6 9/28/2021 #1

因此,这取决于窗口的创建方式。我通过使用样式创建窗口,然后稍后删除该样式来修复它。我不确定它在内部做了什么,但现在当它通过鼠标拖动或使用 API 移动到另一个屏幕时,它可以正确缩放。WS_CAPTIONMoveWindow

::CreateWindowEx(WS_EX_PALETTEWINDOW,...,..., WS_POPUP | WS_CAPTION,...);
::SetWindowLong(hWnd, GWL_STYLE, ::GetWindowLong(hWnd, GWL_STYLE) & ~WS_CAPTION);