Windows 10,DPI缩放和全屏

时间:2017-10-30 16:21:33

标签: winapi windows-10 fullscreen dpi windowed

我有一个来自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会这样做。这意味着,当达到144 dpi时,96 dpi的2560x1440全屏窗口在Windows 8.1上保持2560x1440,但在Windows 10 v1703上调整为3840x2160。

这是正常的,即保持全屏窗口的大小与我在接收WM_GETDPISCALEDSIZE消息时应该手动执行的操作相同吗,该消息曾经在Windows 8.1上自动完成?

编辑:经过进一步测试后,如果窗口是全屏的,那么WM_GETDPISCALEDSIZE消息似乎甚至都没有被发送,只有当它被窗口化时(WS_POPUP可以工作,但只有当它与监视器不同时)。因此,我甚至无法覆盖此行为,Windows 8.1与Windows 10 v1703的工作方式与全屏幕窗口不同。

1 个答案:

答案 0 :(得分:0)

试试这个:

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上的问题吗?