SetProcessDPIAware scheint unter Windows 10 nicht zu funktionieren

Ich versuche, die tatsächliche Bildschirmauflösung (in Pixel) in einer Windows C ++ - App zu ermitteln. Wenn die Windows-dpi-Einstellung geändert wird, erhalte ich die virtuelle (angepasste) Auflösung anstelle der realen. Ich habe versucht, SetProcessDPIAware, SetProcessDpiAwareness (mit allen drei aufgezählten Werten als Argumente) und eine echte Einstellung in einem Manifest zu verwenden. In allen drei Fällen funktioniert der Code in meinem Windows 7-PC einwandfrei (d. H. Zeigt die tatsächliche Auflösung an), in einem Windows 10-PC jedoch nicht (hier ignoriert er die DPI-Aware-Einstellung und gibt die angepasste Auflösung zurück).

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers

// Windows Header Files:
#include <windows.h>
#include <winuser.h>
#include <VersionHelpers.h>
#include <ShellScalingAPI.h>
#include <stdlib.h>
#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
char *cBuffer2 ;

  cBuffer2 = (char *)malloc(3000) ;
  if (IsWindowsVistaOrGreater())
  {
//    SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);
      int result = SetProcessDPIAware();

      sprintf(cBuffer2,"SetProcessDPIAware() result: [%i]\n",result) ;

      int height = GetSystemMetrics(SM_CYSCREEN);
      int width = GetSystemMetrics(SM_CXSCREEN);
      sprintf(cBuffer2,"%s#1:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,height,width) ;


      HWND hwnd = (HWND)atoi(lpCmdLine) ;
      HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
      MONITORINFO info;
      info.cbSize = sizeof(MONITORINFO);
      GetMonitorInfo(monitor, &info);
      int monitor_width = info.rcMonitor.right - info.rcMonitor.left;
      int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
      sprintf(cBuffer2,"%s#2:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,monitor_height,monitor_width) ;

  }

  MessageBox(0,cBuffer2,"SHOWRES.EXE",MB_OK) ;
  return 0 ;
}

Das Manifest, das ich ausprobiert habe, ist das folgende:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Irgendwelche Ideen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage