5 #define QDC_ALL_PATHS 0x00000001
6 #define QDC_ONLY_ACTIVE_PATHS 0x00000002
7 #define QDC_DATABASE_CURRENT 0x00000004
10 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,
11 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
12 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
13 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
14 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
15 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
16 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
17 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
18 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
19 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
20 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
21 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
22 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
23 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
24 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
25 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
26 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
27 } DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
30 DISPLAYCONFIG_ROTATION_IDENTITY = 1,
31 DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
32 DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
33 DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
34 DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
35 } DISPLAYCONFIG_ROTATION;
38 DISPLAYCONFIG_SCALING_IDENTITY = 1,
39 DISPLAYCONFIG_SCALING_CENTERED = 2,
40 DISPLAYCONFIG_SCALING_STRETCHED = 3,
41 DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
42 DISPLAYCONFIG_SCALING_CUSTOM = 5,
43 DISPLAYCONFIG_SCALING_PREFERRED = 128,
44 DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
45 } DISPLAYCONFIG_SCALING;
46 typedef struct DISPLAYCONFIG_RATIONAL
50 } DISPLAYCONFIG_RATIONAL;
53 DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
54 DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
55 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
56 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
57 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
58 DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
59 } DISPLAYCONFIG_SCANLINE_ORDERING;
62 DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
63 DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
64 DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
65 } DISPLAYCONFIG_MODE_INFO_TYPE;
66 typedef struct DISPLAYCONFIG_2DREGION
70 } DISPLAYCONFIG_2DREGION;
71 typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
74 DISPLAYCONFIG_RATIONAL hSyncFreq;
75 DISPLAYCONFIG_RATIONAL vSyncFreq;
76 DISPLAYCONFIG_2DREGION activeSize;
77 DISPLAYCONFIG_2DREGION totalSize;
79 DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
80 } DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
83 DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
84 DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
85 DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
86 DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
87 DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
88 DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
89 } DISPLAYCONFIG_PIXELFORMAT;
92 DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
93 DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
94 DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
95 DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
96 DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32 = 0xFFFFFFFF
97 } DISPLAYCONFIG_TOPOLOGY_ID;
100 DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
101 DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
102 DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
103 DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
104 DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
105 DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
106 } DISPLAYCONFIG_DEVICE_INFO_TYPE;
108 typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
114 } DISPLAYCONFIG_PATH_SOURCE_INFO;
115 typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
120 DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
121 DISPLAYCONFIG_ROTATION rotation;
122 DISPLAYCONFIG_SCALING scaling;
123 DISPLAYCONFIG_RATIONAL refreshRate;
124 DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
125 BOOL targetAvailable;
127 } DISPLAYCONFIG_PATH_TARGET_INFO;
128 typedef struct DISPLAYCONFIG_PATH_INFO
130 DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
131 DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
133 } DISPLAYCONFIG_PATH_INFO;
134 typedef struct DISPLAYCONFIG_TARGET_MODE
136 DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
137 } DISPLAYCONFIG_TARGET_MODE;
138 typedef struct DISPLAYCONFIG_SOURCE_MODE
142 DISPLAYCONFIG_PIXELFORMAT pixelFormat;
144 } DISPLAYCONFIG_SOURCE_MODE;
145 typedef struct DISPLAYCONFIG_MODE_INFO
147 DISPLAYCONFIG_MODE_INFO_TYPE infoType;
152 DISPLAYCONFIG_TARGET_MODE targetMode;
153 DISPLAYCONFIG_SOURCE_MODE sourceMode;
155 } DISPLAYCONFIG_MODE_INFO;
156 typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
158 DISPLAYCONFIG_DEVICE_INFO_TYPE type;
162 } DISPLAYCONFIG_DEVICE_INFO_HEADER;
166 typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
167 typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
168 typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
169 typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
175 TDllHandle(HINSTANCE _hInst)
180 if (hInst) FreeLibrary(hInst);
182 HINSTANCE inst(){ return hInst; }
183 operator HINSTANCE (){ return hInst; }
184 FARPROC GetProcAddress(LPCSTR name)
185 { return ::GetProcAddress(hInst, name); }
188 static TDllHandle *dllHandle = NULL;
189 static FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes;
190 static FNQueryDisplayConfig _QueryDisplayConfig;
191 static bool called = false;
192 static HMONITOR hPrevMonitor = NULL;
193 static int prevDpi = 0;
196 ~TDestructor(){ if (dllHandle){ delete dllHandle; dllHandle = NULL; } }
199 int GetMonitorScale()
205 HINSTANCE hDll = LoadLibrary( _T("user32") );
209 TDllHandle hInst(hDll);
210 dllHandle = new TDllHandle(hDll);
212 _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)dllHandle->GetProcAddress("GetDisplayConfigBufferSizes");
213 if (!_GetDisplayConfigBufferSizes) return dpi;
214 _QueryDisplayConfig = (FNQueryDisplayConfig)dllHandle->GetProcAddress("QueryDisplayConfig");
215 if (!_QueryDisplayConfig) return dpi;
218 if (!dllHandle) return dpi;
222 HMONITOR hMonitor = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL );
223 if (!hMonitor) return dpi;
225 if (hMonitor == hPrevMonitor){
228 hPrevMonitor = hMonitor;
230 MONITORINFOEX LogicalMonitorInfo;
231 LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);
232 GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
233 int LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
235 int LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
239 _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
241 DISPLAYCONFIG_PATH_INFO *dpis = new DISPLAYCONFIG_PATH_INFO[numofpath];
242 DISPLAYCONFIG_MODE_INFO *pModeInfoArray = new DISPLAYCONFIG_MODE_INFO[numofmode];
243 DISPLAYCONFIG_TOPOLOGY_ID tid;
244 _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid); //TODO: Windows7 or later
246 int PhysicalDesktopWidth = LogicalDesktopWidth;
247 int PhysicalMonitorWidth = LogicalMonitorWidth;
249 for (int i=0;i<(int)numofmode;i++){
250 if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE){
251 //DBW("%d: %d", i, pModeInfoArray[i].sourceMode.width);
252 PhysicalDesktopWidth = pModeInfoArray[i].sourceMode.width;
253 //int PhysicalDesktopWidth =
254 //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
257 if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){
258 PhysicalMonitorWidth = pModeInfoArray[i].targetMode.targetVideoSignalInfo.activeSize.cx;
259 //DBW("%d: %d", i, PhysicalMonitorWidth);
263 //int PhysicalMonitorWidth = pModeInfoArray[i].sourceMode.width;
264 //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
267 delete[] pModeInfoArray;
269 return prevDpi = dpi * PhysicalDesktopWidth / LogicalDesktopWidth;