les coordonnées du moniteur secondaire sont étranges lors de l’utilisation de dpiawareness = 1

J’ai deux moniteurs:

DISPLAY2: 3840x2160 (primary (no idea why it's called DISPLAY2 though) DISPLAY1: 1920x1080 (located right of primary) 

J’ai écrit un petit programme pour imprimer leur géomésortinge et il affiche:

 \\.\DISPLAY2; x=0, y=0; 3840x2160 \\.\DISPLAY1; x=3840, y=278; 1920x1080 

Ce qui a l’air correct Cependant, si j’appelle SetProcessDpiAwareness((PROCESS_DPI_AWARENESS) 1); , alors il va imprimer:

 \\.\DISPLAY2; x=0, y=0; 7680x4320 \\.\DISPLAY1; x=7680, y=556; 3840x2160 

Pourquoi les tailles ont-elles juste doublé?

Notez que je n’utilise aucun facteur de mise à l’échelle sur mes moniteurs pour savoir ce qui se passe en premier. Mais voici ce qu’il imprime si je règle une mise à l’échelle 2x sur le moniteur principal:

 \\.\DISPLAY2; x=0, y=0; 3840x2160 \\.\DISPLAY1; x=7680, y=556; 3840x2160 

Pourquoi le moniteur secondaire à partir de x = 7680?

Voici le code que j’ai utilisé pour imprimer les valeurs:

 #include  #include  #include  #pragma comment(lib, "Shcore.lib") #pragma comment(lib, "User32.lib") BOOL monitorEnumCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM) { MONITORINFOEX info; memset(&info, 0, sizeof(MONITORINFOEX)); info.cbSize = sizeof(MONITORINFOEX); if (!GetMonitorInfo(hMonitor, &info)) return false; std::cout << info.szDevice << "; x="<< info.rcMonitor.left << ", y=" << info.rcMonitor.top << "; " << (info.rcMonitor.right - info.rcMonitor.left) << "x" << (info.rcMonitor.bottom - info.rcMonitor.top) << "\n"; return true; } int main() { int result = SetProcessDpiAwareness((PROCESS_DPI_AWARENESS) 1); if (result) { std::cout << "Failed to call SetProcessDpiAwareness\n"; return 1; } EnumDisplayMonitors(0, 0, monitorEnumCallback, reinterpret_cast(&result)); return 0; } 

Il peut être intéressant (1) d’imprimer le DPI du système pour chaque cas et (2) d’essayer également SetProcessDpiAwareness (PROCESS_PER_MONITOR_DPI_AWARE). Le DPI de vos deux écrans est probablement différent (ou au moins Windows le pense).

Vous avez dit à Windows que vous connaissiez un seul DPI au niveau du système. Pour s’assurer que les applications font ce qu’il faut dans ce cas, Windows a concocté un système de coordonnées d’écran virtuel qui permet aux applications qui basent toute leur mise en page sur le DPI du moniteur principal d’obtenir de bons résultats sur les deux écrans. S’il avait utilisé le DPI du moniteur principal, votre programme pourrait ne pas choisir les meilleures tailles et coordonnées d’icône lors du dessin sur le moniteur secondaire. De même, si elle a utilisé le DPI du moniteur secondaire, les applications ne pourraient pas effectuer un positionnement parfait en pixels sur le primaire. Utiliser le double des DPI plus élevés et la réduction d’échelle est probablement un compromis raisonnable si vous examinez toutes les interactions avec le dessin GDI (ClearType), Direct2D, les messages de souris et de pointeur, etc.

Si votre application était compatible avec chaque moniteur, je pense que vous obtiendrez de vraies valeurs à tous les niveaux.