我有一个应用程序,Windows 8.1 中的 PROCESS_PER_MONITOR_DPI_AWARE 和 Windows 10 v1703 中的 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 。我的窗口在窗口模式下具有 WS_OVERLAPPEDWINDOW 样式,并且在全屏显示时将它们切换为监视器大小的 WS_POPUP。
当我更改同一显示器上的 DPI 时,窗口模式窗口会在 Windows 8.1 和 Windows 10 v1703 上的 WM_DPICHANGED 消息中获得正确缩放的窗口大小。然而,当全屏时,Windows 8.1 不会调整全屏窗口的大小(它保持相同的尺寸),但 Windows 10 v1703 会这样做。这意味着,96 dpi 的 2560x1440 全屏窗口在 Windows 8.1 上保持 2560x1440,例如 144 dpi,但在 Windows 10 v1703 上调整为 3840x2160。
这是正常的吗?即,在接收 WM_GETDPISCALEDSIZE 消息时,我现在应该手动执行保持全屏窗口相同大小的操作,而这在 Windows 8.1 上是自动完成的?
编辑:经过进一步测试,如果窗口是全屏,则 WM_GETDPISCALEDSIZE 消息似乎不会发送,只有在窗口化时才会发送(WS_POPUP 有效,但仅当大小与监视器不同时)。因此,我什至无法覆盖此行为,并且 Windows 8.1 对于全屏窗口的工作方式与 Windows 10 v1703 不同。
尝试这个:
void ShowFullScreen(HWND hwnd)
{
LONG exStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
LONG style = ::GetWindowLong(hwnd, GWL_STYLE);
::SetWindowLong(hwnd, GWL_STYLE,
(style & ~WS_OVERLAPPEDWINDOW) | WS_POPUPWINDOW);
::SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_TOPMOST);
::ShowWindow(hwnd, SW_SHOWMAXIMIZED);
}
是否有助于解决W8.1上的问题?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)