4 #include "MonitorScale.h"
8 #define QDC_ALL_PATHS 0x00000001
9 #define QDC_ONLY_ACTIVE_PATHS 0x00000002
10 #define QDC_DATABASE_CURRENT 0x00000004
13 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,
14 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
15 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
16 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
17 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
18 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
19 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
20 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
21 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
22 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
23 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
24 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
25 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
26 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
27 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
28 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
29 DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
30 } DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
33 DISPLAYCONFIG_ROTATION_IDENTITY = 1,
34 DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
35 DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
36 DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
37 DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
38 } DISPLAYCONFIG_ROTATION;
41 DISPLAYCONFIG_SCALING_IDENTITY = 1,
42 DISPLAYCONFIG_SCALING_CENTERED = 2,
43 DISPLAYCONFIG_SCALING_STRETCHED = 3,
44 DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
45 DISPLAYCONFIG_SCALING_CUSTOM = 5,
46 DISPLAYCONFIG_SCALING_PREFERRED = 128,
47 DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
48 } DISPLAYCONFIG_SCALING;
49 typedef struct DISPLAYCONFIG_RATIONAL
53 } DISPLAYCONFIG_RATIONAL;
56 DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
57 DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
58 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
59 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
60 DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
61 DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
62 } DISPLAYCONFIG_SCANLINE_ORDERING;
65 DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
66 DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
67 DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
68 } DISPLAYCONFIG_MODE_INFO_TYPE;
69 typedef struct DISPLAYCONFIG_2DREGION
73 } DISPLAYCONFIG_2DREGION;
74 typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
77 DISPLAYCONFIG_RATIONAL hSyncFreq;
78 DISPLAYCONFIG_RATIONAL vSyncFreq;
79 DISPLAYCONFIG_2DREGION activeSize;
80 DISPLAYCONFIG_2DREGION totalSize;
82 DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
83 } DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
86 DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
87 DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
88 DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
89 DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
90 DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
91 DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
92 } DISPLAYCONFIG_PIXELFORMAT;
95 DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
96 DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
97 DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
98 DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
99 DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32 = 0xFFFFFFFF
100 } DISPLAYCONFIG_TOPOLOGY_ID;
103 DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
104 DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
105 DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
106 DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
107 DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
108 DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
109 } DISPLAYCONFIG_DEVICE_INFO_TYPE;
111 typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
117 } DISPLAYCONFIG_PATH_SOURCE_INFO;
118 typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
123 DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
124 DISPLAYCONFIG_ROTATION rotation;
125 DISPLAYCONFIG_SCALING scaling;
126 DISPLAYCONFIG_RATIONAL refreshRate;
127 DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
128 BOOL targetAvailable;
130 } DISPLAYCONFIG_PATH_TARGET_INFO;
131 typedef struct DISPLAYCONFIG_PATH_INFO
133 DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
134 DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
136 } DISPLAYCONFIG_PATH_INFO;
137 typedef struct DISPLAYCONFIG_TARGET_MODE
139 DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
140 } DISPLAYCONFIG_TARGET_MODE;
141 typedef struct DISPLAYCONFIG_SOURCE_MODE
145 DISPLAYCONFIG_PIXELFORMAT pixelFormat;
147 } DISPLAYCONFIG_SOURCE_MODE;
148 typedef struct DISPLAYCONFIG_MODE_INFO
150 DISPLAYCONFIG_MODE_INFO_TYPE infoType;
155 DISPLAYCONFIG_TARGET_MODE targetMode;
156 DISPLAYCONFIG_SOURCE_MODE sourceMode;
158 } DISPLAYCONFIG_MODE_INFO;
159 typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
161 DISPLAYCONFIG_DEVICE_INFO_TYPE type;
165 } DISPLAYCONFIG_DEVICE_INFO_HEADER;
169 typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
170 typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
171 typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
172 typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
178 TDllHandle(HINSTANCE _hInst)
183 if (hInst) FreeLibrary(hInst);
185 HINSTANCE inst(){ return hInst; }
186 operator HINSTANCE (){ return hInst; }
187 FARPROC GetProcAddress(LPCSTR name)
188 { return ::GetProcAddress(hInst, name); }
191 int GetMonitorScale()
195 HINSTANCE hDll = LoadLibrary( _T("user32") );
199 TDllHandle hInst(hDll);
201 FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)GetProcAddress(hInst, "GetDisplayConfigBufferSizes");
202 if (!_GetDisplayConfigBufferSizes)
204 FNQueryDisplayConfig _QueryDisplayConfig = (FNQueryDisplayConfig)GetProcAddress(hInst, "QueryDisplayConfig");
205 if (!_QueryDisplayConfig)
211 int PhysicalDesktopWidth;
212 int PhysicalMonitorWidth;
213 DISPLAYCONFIG_PATH_INFO *dpis = NULL;
214 DISPLAYCONFIG_MODE_INFO *pModeInfoArray = NULL;
219 LONG ret = _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
220 if (ret!=ERROR_SUCCESS)
225 dpis = new DISPLAYCONFIG_PATH_INFO[numofpath];
227 pModeInfoArray = new DISPLAYCONFIG_MODE_INFO[numofmode];
228 if (!pModeInfoArray) break;
229 DISPLAYCONFIG_TOPOLOGY_ID tid;
230 //Note: QDC_ONLY_ACTIVE_PATHS
\82ð
\8ew
\92è
\82·
\82é
\82Æparameter error
\82ª
\95Ô
\82Á
\82Ä
\82
\82é
\81H
\81H
231 ret = _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid); //TODO: Windows7 or later
232 if (ret == ERROR_INSUFFICIENT_BUFFER){
234 delete[] pModeInfoArray;
237 if (ret != ERROR_SUCCESS){
242 for (int i=0;i<(int)numofpath;i++){
243 //Note: DISPLAYCONFIG_PATH_ACTIVE
\82Ì
\92è
\8b`
\82ª
\95s
\96¾
244 // Active
\82Èpath
\82ª
\8dÅ
\8f\89\97ñ
\8b\93\82³
\82ê
\82é
\81A
\82Ædocument
\82É
\82 \82é
\82Ì
\82Å
\96â
\91è
\82È
\82¢
\82Æ
\8ev
\82¤
\82ª
245 //if (!(dpis[i].flags & DISPLAYCONFIG_PATH_ACTIVE)) continue;
246 DISPLAYCONFIG_SOURCE_MODE &srcMode = pModeInfoArray[ dpis[i].sourceInfo.modeInfoIdx ].sourceMode;
247 if (pt.x >= srcMode.position.x && pt.x < srcMode.position.x + srcMode.width
248 && pt.y >= srcMode.position.y && pt.y < srcMode.position.y + srcMode.height){
249 // included in a desktop area
250 PhysicalDesktopWidth = srcMode.width;
251 DISPLAYCONFIG_TARGET_MODE &targetMode = pModeInfoArray[ dpis[i].targetInfo.modeInfoIdx ].targetMode;
252 PhysicalMonitorWidth = targetMode.targetVideoSignalInfo.activeSize.cx;
254 dbw("ok: %d %d @(%d,%d)", PhysicalDesktopWidth, PhysicalMonitorWidth, pt.x, pt.y);
261 if (dpis) delete[] dpis;
262 if (pModeInfoArray) delete[] pModeInfoArray;
265 return dpi * PhysicalDesktopWidth / PhysicalMonitorWidth;