3

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 のフルスクリーン ウィンドウが、たとえば 144 dpi になると、Windows 8.1 では 2560x1440 のままですが、Windows 10 v1703 では 3840x2160 にサイズ変更されることを意味します。

Windows 8.1 で自動的に行われていた WM_GETDPISCALEDSIZE メッセージを受信したときに手動で行う必要があるのと同じサイズのフルスクリーン ウィンドウを維持するのは正常ですか?

編集:さらにテストした後、WM_GETDPISCALEDSIZEメッセージは、ウィンドウがフルスクリーンの場合、ウィンドウ化されている場合にのみ送信されないようです(WS_POPUPは機能しますが、サイズがモニターと同じでない場合のみ)。したがって、この動作をオーバーライドすることもできず、Windows 8.1 はフルスクリーン ウィンドウの Windows 10 v1703 とは異なる動作をします。

4

1 に答える 1

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 の問題を解決するのに役立ちますか?

于 2017-10-30T20:18:40.300 に答える