mirror of https://github.com/opencv/opencv.git
commit
9dfb96389c
8 changed files with 18 additions and 515 deletions
@ -1,502 +0,0 @@ |
|||||||
//=============================================================================
|
|
||||||
//
|
|
||||||
// multimon.h -- Stub module that fakes multiple monitor apis on Win32 OSes
|
|
||||||
// without them.
|
|
||||||
//
|
|
||||||
// By using this header your code will get back default values from
|
|
||||||
// GetSystemMetrics() for new metrics, and the new multimonitor APIs
|
|
||||||
// will act like only one display is present on a Win32 OS without
|
|
||||||
// multimonitor APIs.
|
|
||||||
//
|
|
||||||
// Exactly one source must include this with COMPILE_MULTIMON_STUBS defined.
|
|
||||||
//
|
|
||||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
//
|
|
||||||
//=============================================================================
|
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
extern "C" { // Assume C declarations for C++
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
//
|
|
||||||
// If we are building with Win95/NT4 headers, we need to declare
|
|
||||||
// the multimonitor-related metrics and APIs ourselves.
|
|
||||||
//
|
|
||||||
#ifndef SM_CMONITORS |
|
||||||
|
|
||||||
#define SM_XVIRTUALSCREEN 76 |
|
||||||
#define SM_YVIRTUALSCREEN 77 |
|
||||||
#define SM_CXVIRTUALSCREEN 78 |
|
||||||
#define SM_CYVIRTUALSCREEN 79 |
|
||||||
#define SM_CMONITORS 80 |
|
||||||
#define SM_SAMEDISPLAYFORMAT 81 |
|
||||||
|
|
||||||
// HMONITOR is already declared if WINVER >= 0x0500 in windef.h
|
|
||||||
// This is for components built with an older version number.
|
|
||||||
//
|
|
||||||
#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500) |
|
||||||
DECLARE_HANDLE(HMONITOR); |
|
||||||
#define HMONITOR_DECLARED |
|
||||||
#endif |
|
||||||
|
|
||||||
#define MONITOR_DEFAULTTONULL 0x00000000 |
|
||||||
#define MONITOR_DEFAULTTOPRIMARY 0x00000001 |
|
||||||
#define MONITOR_DEFAULTTONEAREST 0x00000002 |
|
||||||
|
|
||||||
#define MONITORINFOF_PRIMARY 0x00000001 |
|
||||||
|
|
||||||
typedef struct tagMONITORINFO |
|
||||||
{ |
|
||||||
DWORD cbSize; |
|
||||||
RECT rcMonitor; |
|
||||||
RECT rcWork; |
|
||||||
DWORD dwFlags; |
|
||||||
} MONITORINFO, *LPMONITORINFO; |
|
||||||
|
|
||||||
#ifndef CCHDEVICENAME |
|
||||||
#define CCHDEVICENAME 32 |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
typedef struct tagMONITORINFOEXA : public tagMONITORINFO |
|
||||||
{ |
|
||||||
CHAR szDevice[CCHDEVICENAME]; |
|
||||||
} MONITORINFOEXA, *LPMONITORINFOEXA; |
|
||||||
typedef struct tagMONITORINFOEXW : public tagMONITORINFO |
|
||||||
{ |
|
||||||
WCHAR szDevice[CCHDEVICENAME]; |
|
||||||
} MONITORINFOEXW, *LPMONITORINFOEXW; |
|
||||||
#ifdef UNICODE |
|
||||||
typedef MONITORINFOEXW MONITORINFOEX; |
|
||||||
typedef LPMONITORINFOEXW LPMONITORINFOEX; |
|
||||||
#else |
|
||||||
typedef MONITORINFOEXA MONITORINFOEX; |
|
||||||
typedef LPMONITORINFOEXA LPMONITORINFOEX; |
|
||||||
#endif // UNICODE
|
|
||||||
#else // ndef __cplusplus
|
|
||||||
typedef struct tagMONITORINFOEXA |
|
||||||
{ |
|
||||||
MONITORINFO; |
|
||||||
CHAR szDevice[CCHDEVICENAME]; |
|
||||||
} MONITORINFOEXA, *LPMONITORINFOEXA; |
|
||||||
typedef struct tagMONITORINFOEXW |
|
||||||
{ |
|
||||||
MONITORINFO; |
|
||||||
WCHAR szDevice[CCHDEVICENAME]; |
|
||||||
} MONITORINFOEXW, *LPMONITORINFOEXW; |
|
||||||
#ifdef UNICODE |
|
||||||
typedef MONITORINFOEXW MONITORINFOEX; |
|
||||||
typedef LPMONITORINFOEXW LPMONITORINFOEX; |
|
||||||
#else |
|
||||||
typedef MONITORINFOEXA MONITORINFOEX; |
|
||||||
typedef LPMONITORINFOEXA LPMONITORINFOEX; |
|
||||||
#endif // UNICODE
|
|
||||||
#endif |
|
||||||
|
|
||||||
typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM); |
|
||||||
|
|
||||||
#ifndef DISPLAY_DEVICE_ATTACHED_TO_DESKTOP |
|
||||||
typedef struct _DISPLAY_DEVICEA { |
|
||||||
DWORD cb; |
|
||||||
CHAR DeviceName[32]; |
|
||||||
CHAR DeviceString[128]; |
|
||||||
DWORD StateFlags; |
|
||||||
CHAR DeviceID[128]; |
|
||||||
CHAR DeviceKey[128]; |
|
||||||
} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA; |
|
||||||
typedef struct _DISPLAY_DEVICEW { |
|
||||||
DWORD cb; |
|
||||||
WCHAR DeviceName[32]; |
|
||||||
WCHAR DeviceString[128]; |
|
||||||
DWORD StateFlags; |
|
||||||
WCHAR DeviceID[128]; |
|
||||||
WCHAR DeviceKey[128]; |
|
||||||
} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW; |
|
||||||
#ifdef UNICODE |
|
||||||
typedef DISPLAY_DEVICEW DISPLAY_DEVICE; |
|
||||||
typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE; |
|
||||||
typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE; |
|
||||||
#else |
|
||||||
typedef DISPLAY_DEVICEA DISPLAY_DEVICE; |
|
||||||
typedef PDISPLAY_DEVICEA PDISPLAY_DEVICE; |
|
||||||
typedef LPDISPLAY_DEVICEA LPDISPLAY_DEVICE; |
|
||||||
#endif // UNICODE
|
|
||||||
|
|
||||||
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001 |
|
||||||
#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002 |
|
||||||
#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 |
|
||||||
#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008 |
|
||||||
#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010 |
|
||||||
#endif |
|
||||||
|
|
||||||
#endif // SM_CMONITORS
|
|
||||||
|
|
||||||
#undef GetMonitorInfo |
|
||||||
#undef GetSystemMetrics |
|
||||||
#undef MonitorFromWindow |
|
||||||
#undef MonitorFromRect |
|
||||||
#undef MonitorFromPoint |
|
||||||
#undef EnumDisplayMonitors |
|
||||||
#undef EnumDisplayDevices |
|
||||||
|
|
||||||
//
|
|
||||||
// Define COMPILE_MULTIMON_STUBS to compile the stubs;
|
|
||||||
// otherwise, you get the declarations.
|
|
||||||
//
|
|
||||||
#ifdef COMPILE_MULTIMON_STUBS |
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Implement the API stubs.
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef _MULTIMON_USE_SECURE_CRT |
|
||||||
#if defined(__GOT_SECURE_LIB__) && __GOT_SECURE_LIB__ >= 200402L |
|
||||||
#define _MULTIMON_USE_SECURE_CRT 1 |
|
||||||
#else |
|
||||||
#define _MULTIMON_USE_SECURE_CRT 0 |
|
||||||
#endif |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifndef MULTIMON_FNS_DEFINED |
|
||||||
|
|
||||||
int (WINAPI* g_pfnGetSystemMetrics)(int) = NULL; |
|
||||||
HMONITOR (WINAPI* g_pfnMonitorFromWindow)(HWND, DWORD) = NULL; |
|
||||||
HMONITOR (WINAPI* g_pfnMonitorFromRect)(LPCRECT, DWORD) = NULL; |
|
||||||
HMONITOR (WINAPI* g_pfnMonitorFromPoint)(POINT, DWORD) = NULL; |
|
||||||
BOOL (WINAPI* g_pfnGetMonitorInfo)(HMONITOR, LPMONITORINFO) = NULL; |
|
||||||
BOOL (WINAPI* g_pfnEnumDisplayMonitors)(HDC, LPCRECT, MONITORENUMPROC, LPARAM) = NULL; |
|
||||||
BOOL (WINAPI* g_pfnEnumDisplayDevices)(PVOID, DWORD, PDISPLAY_DEVICE,DWORD) = NULL; |
|
||||||
BOOL g_fMultiMonInitDone = FALSE; |
|
||||||
BOOL g_fMultimonPlatformNT = FALSE; |
|
||||||
|
|
||||||
#endif |
|
||||||
|
|
||||||
BOOL IsPlatformNT() |
|
||||||
{ |
|
||||||
OSVERSIONINFOA osvi = {0}; |
|
||||||
osvi.dwOSVersionInfoSize = sizeof(osvi); |
|
||||||
GetVersionExA((OSVERSIONINFOA*)&osvi); |
|
||||||
return (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId); |
|
||||||
} |
|
||||||
|
|
||||||
BOOL InitMultipleMonitorStubs(void) |
|
||||||
{ |
|
||||||
HMODULE hUser32; |
|
||||||
if (g_fMultiMonInitDone) |
|
||||||
{ |
|
||||||
return g_pfnGetMonitorInfo != NULL; |
|
||||||
} |
|
||||||
|
|
||||||
g_fMultimonPlatformNT = IsPlatformNT(); |
|
||||||
hUser32 = GetModuleHandle(TEXT("USER32")); |
|
||||||
if (hUser32 && |
|
||||||
(*(FARPROC*)&g_pfnGetSystemMetrics = GetProcAddress(hUser32,"GetSystemMetrics")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnMonitorFromWindow = GetProcAddress(hUser32,"MonitorFromWindow")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnMonitorFromRect = GetProcAddress(hUser32,"MonitorFromRect")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnMonitorFromPoint = GetProcAddress(hUser32,"MonitorFromPoint")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnEnumDisplayMonitors = GetProcAddress(hUser32,"EnumDisplayMonitors")) != NULL && |
|
||||||
#ifdef UNICODE |
|
||||||
(*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesW")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnGetMonitorInfo = g_fMultimonPlatformNT ? GetProcAddress(hUser32,"GetMonitorInfoW") : |
|
||||||
GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL |
|
||||||
#else |
|
||||||
(*(FARPROC*)&g_pfnGetMonitorInfo = GetProcAddress(hUser32,"GetMonitorInfoA")) != NULL && |
|
||||||
(*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(hUser32,"EnumDisplayDevicesA")) != NULL |
|
||||||
#endif |
|
||||||
) { |
|
||||||
g_fMultiMonInitDone = TRUE; |
|
||||||
return TRUE; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
g_pfnGetSystemMetrics = NULL; |
|
||||||
g_pfnMonitorFromWindow = NULL; |
|
||||||
g_pfnMonitorFromRect = NULL; |
|
||||||
g_pfnMonitorFromPoint = NULL; |
|
||||||
g_pfnGetMonitorInfo = NULL; |
|
||||||
g_pfnEnumDisplayMonitors = NULL; |
|
||||||
g_pfnEnumDisplayDevices = NULL; |
|
||||||
|
|
||||||
g_fMultiMonInitDone = TRUE; |
|
||||||
return FALSE; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// fake implementations of Monitor APIs that work with the primary display
|
|
||||||
// no special parameter validation is made since these run in client code
|
|
||||||
//
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
int WINAPI |
|
||||||
xGetSystemMetrics(int nIndex) |
|
||||||
{ |
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
return g_pfnGetSystemMetrics(nIndex); |
|
||||||
|
|
||||||
switch (nIndex) |
|
||||||
{ |
|
||||||
case SM_CMONITORS: |
|
||||||
case SM_SAMEDISPLAYFORMAT: |
|
||||||
return 1; |
|
||||||
|
|
||||||
case SM_XVIRTUALSCREEN: |
|
||||||
case SM_YVIRTUALSCREEN: |
|
||||||
return 0; |
|
||||||
|
|
||||||
case SM_CXVIRTUALSCREEN: |
|
||||||
nIndex = SM_CXSCREEN; |
|
||||||
break; |
|
||||||
|
|
||||||
case SM_CYVIRTUALSCREEN: |
|
||||||
nIndex = SM_CYSCREEN; |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
return GetSystemMetrics(nIndex); |
|
||||||
} |
|
||||||
|
|
||||||
#define xPRIMARY_MONITOR ((HMONITOR)0x12340042) |
|
||||||
|
|
||||||
HMONITOR WINAPI |
|
||||||
xMonitorFromPoint(POINT ptScreenCoords, DWORD dwFlags) |
|
||||||
{ |
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
return g_pfnMonitorFromPoint(ptScreenCoords, dwFlags); |
|
||||||
|
|
||||||
if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) || |
|
||||||
((ptScreenCoords.x >= 0) && |
|
||||||
(ptScreenCoords.x < GetSystemMetrics(SM_CXSCREEN)) && |
|
||||||
(ptScreenCoords.y >= 0) && |
|
||||||
(ptScreenCoords.y < GetSystemMetrics(SM_CYSCREEN)))) |
|
||||||
{ |
|
||||||
return xPRIMARY_MONITOR; |
|
||||||
} |
|
||||||
|
|
||||||
return NULL; |
|
||||||
} |
|
||||||
|
|
||||||
HMONITOR WINAPI |
|
||||||
xMonitorFromRect(LPCRECT lprcScreenCoords, DWORD dwFlags) |
|
||||||
{ |
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
return g_pfnMonitorFromRect(lprcScreenCoords, dwFlags); |
|
||||||
|
|
||||||
if ((dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) || |
|
||||||
((lprcScreenCoords->right > 0) && |
|
||||||
(lprcScreenCoords->bottom > 0) && |
|
||||||
(lprcScreenCoords->left < GetSystemMetrics(SM_CXSCREEN)) && |
|
||||||
(lprcScreenCoords->top < GetSystemMetrics(SM_CYSCREEN)))) |
|
||||||
{ |
|
||||||
return xPRIMARY_MONITOR; |
|
||||||
} |
|
||||||
|
|
||||||
return NULL; |
|
||||||
} |
|
||||||
|
|
||||||
HMONITOR WINAPI |
|
||||||
xMonitorFromWindow(HWND hWnd, DWORD dwFlags) |
|
||||||
{ |
|
||||||
WINDOWPLACEMENT wp; |
|
||||||
|
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
return g_pfnMonitorFromWindow(hWnd, dwFlags); |
|
||||||
|
|
||||||
if (dwFlags & (MONITOR_DEFAULTTOPRIMARY | MONITOR_DEFAULTTONEAREST)) |
|
||||||
return xPRIMARY_MONITOR; |
|
||||||
|
|
||||||
if (IsIconic(hWnd) ? |
|
||||||
GetWindowPlacement(hWnd, &wp) : |
|
||||||
GetWindowRect(hWnd, &wp.rcNormalPosition)) { |
|
||||||
|
|
||||||
return xMonitorFromRect(&wp.rcNormalPosition, dwFlags); |
|
||||||
} |
|
||||||
|
|
||||||
return NULL; |
|
||||||
} |
|
||||||
|
|
||||||
BOOL WINAPI |
|
||||||
xGetMonitorInfo(HMONITOR hMonitor, __inout LPMONITORINFO lpMonitorInfo) |
|
||||||
{ |
|
||||||
RECT rcWork; |
|
||||||
|
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
{ |
|
||||||
BOOL f = g_pfnGetMonitorInfo(hMonitor, lpMonitorInfo); |
|
||||||
#ifdef UNICODE |
|
||||||
if (f && !g_fMultimonPlatformNT && (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX))) |
|
||||||
{ |
|
||||||
MultiByteToWideChar(CP_ACP, 0, |
|
||||||
(LPSTR)((MONITORINFOEX*)lpMonitorInfo)->szDevice, -1, |
|
||||||
((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR))); |
|
||||||
} |
|
||||||
#endif |
|
||||||
return f; |
|
||||||
} |
|
||||||
|
|
||||||
if ((hMonitor == xPRIMARY_MONITOR) && |
|
||||||
lpMonitorInfo && |
|
||||||
(lpMonitorInfo->cbSize >= sizeof(MONITORINFO)) && |
|
||||||
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rcWork, 0)) |
|
||||||
{ |
|
||||||
lpMonitorInfo->rcMonitor.left = 0; |
|
||||||
lpMonitorInfo->rcMonitor.top = 0; |
|
||||||
lpMonitorInfo->rcMonitor.right = GetSystemMetrics(SM_CXSCREEN); |
|
||||||
lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics(SM_CYSCREEN); |
|
||||||
lpMonitorInfo->rcWork = rcWork; |
|
||||||
lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY; |
|
||||||
|
|
||||||
if (lpMonitorInfo->cbSize >= sizeof(MONITORINFOEX)) |
|
||||||
{ |
|
||||||
#ifdef UNICODE |
|
||||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, ((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR))); |
|
||||||
#else // UNICODE
|
|
||||||
#if _MULTIMON_USE_SECURE_CRT |
|
||||||
strncpy_s(((MONITORINFOEX*)lpMonitorInfo)->szDevice, (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR)) - 1); |
|
||||||
#else |
|
||||||
lstrcpyn(((MONITORINFOEX*)lpMonitorInfo)->szDevice, TEXT("DISPLAY"), (sizeof(((MONITORINFOEX*)lpMonitorInfo)->szDevice)/sizeof(TCHAR))); |
|
||||||
#endif // _MULTIMON_USE_SECURE_CRT
|
|
||||||
#endif // UNICODE
|
|
||||||
} |
|
||||||
|
|
||||||
return TRUE; |
|
||||||
} |
|
||||||
|
|
||||||
return FALSE; |
|
||||||
} |
|
||||||
|
|
||||||
BOOL WINAPI |
|
||||||
xEnumDisplayMonitors( |
|
||||||
HDC hdcOptionalForPainting, |
|
||||||
LPCRECT lprcEnumMonitorsThatIntersect, |
|
||||||
MONITORENUMPROC lpfnEnumProc, |
|
||||||
LPARAM dwData) |
|
||||||
{ |
|
||||||
RECT rcLimit; |
|
||||||
|
|
||||||
if (InitMultipleMonitorStubs()) { |
|
||||||
return g_pfnEnumDisplayMonitors( |
|
||||||
hdcOptionalForPainting, |
|
||||||
lprcEnumMonitorsThatIntersect, |
|
||||||
lpfnEnumProc, |
|
||||||
dwData); |
|
||||||
} |
|
||||||
|
|
||||||
if (!lpfnEnumProc) |
|
||||||
return FALSE; |
|
||||||
|
|
||||||
rcLimit.left = 0; |
|
||||||
rcLimit.top = 0; |
|
||||||
rcLimit.right = GetSystemMetrics(SM_CXSCREEN); |
|
||||||
rcLimit.bottom = GetSystemMetrics(SM_CYSCREEN); |
|
||||||
|
|
||||||
if (hdcOptionalForPainting) |
|
||||||
{ |
|
||||||
RECT rcClip; |
|
||||||
POINT ptOrg; |
|
||||||
|
|
||||||
switch (GetClipBox(hdcOptionalForPainting, &rcClip)) |
|
||||||
{ |
|
||||||
default: |
|
||||||
if (!GetDCOrgEx(hdcOptionalForPainting, &ptOrg)) |
|
||||||
return FALSE; |
|
||||||
|
|
||||||
OffsetRect(&rcLimit, -ptOrg.x, -ptOrg.y); |
|
||||||
if (IntersectRect(&rcLimit, &rcLimit, &rcClip) && |
|
||||||
(!lprcEnumMonitorsThatIntersect || |
|
||||||
IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect))) { |
|
||||||
|
|
||||||
break; |
|
||||||
} |
|
||||||
//fall thru
|
|
||||||
case NULLREGION: |
|
||||||
return TRUE; |
|
||||||
case ERROR: |
|
||||||
return FALSE; |
|
||||||
} |
|
||||||
} else { |
|
||||||
if ( lprcEnumMonitorsThatIntersect && |
|
||||||
!IntersectRect(&rcLimit, &rcLimit, lprcEnumMonitorsThatIntersect)) { |
|
||||||
|
|
||||||
return TRUE; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return lpfnEnumProc( |
|
||||||
xPRIMARY_MONITOR, |
|
||||||
hdcOptionalForPainting, |
|
||||||
&rcLimit, |
|
||||||
dwData); |
|
||||||
} |
|
||||||
|
|
||||||
BOOL WINAPI |
|
||||||
xEnumDisplayDevices( |
|
||||||
PVOID Unused, |
|
||||||
DWORD iDevNum, |
|
||||||
__inout PDISPLAY_DEVICE lpDisplayDevice, |
|
||||||
DWORD dwFlags) |
|
||||||
{ |
|
||||||
if (InitMultipleMonitorStubs()) |
|
||||||
return g_pfnEnumDisplayDevices(Unused, iDevNum, lpDisplayDevice, dwFlags); |
|
||||||
|
|
||||||
if (Unused != NULL) |
|
||||||
return FALSE; |
|
||||||
|
|
||||||
if (iDevNum != 0) |
|
||||||
return FALSE; |
|
||||||
|
|
||||||
if (lpDisplayDevice == NULL || lpDisplayDevice->cb < sizeof(DISPLAY_DEVICE)) |
|
||||||
return FALSE; |
|
||||||
|
|
||||||
#ifdef UNICODE |
|
||||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceName, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR))); |
|
||||||
MultiByteToWideChar(CP_ACP, 0, "DISPLAY", -1, lpDisplayDevice->DeviceString, (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR))); |
|
||||||
#else // UNICODE
|
|
||||||
#if _MULTIMON_USE_SECURE_CRT |
|
||||||
strncpy_s((LPTSTR)lpDisplayDevice->DeviceName, (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)) - 1); |
|
||||||
strncpy_s((LPTSTR)lpDisplayDevice->DeviceString, (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR)), TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR)) - 1); |
|
||||||
#else |
|
||||||
lstrcpyn((LPTSTR)lpDisplayDevice->DeviceName, TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceName)/sizeof(TCHAR))); |
|
||||||
lstrcpyn((LPTSTR)lpDisplayDevice->DeviceString, TEXT("DISPLAY"), (sizeof(lpDisplayDevice->DeviceString)/sizeof(TCHAR))); |
|
||||||
#endif // _MULTIMON_USE_SECURE_CRT
|
|
||||||
#endif // UNICODE
|
|
||||||
|
|
||||||
lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_PRIMARY_DEVICE; |
|
||||||
|
|
||||||
return TRUE; |
|
||||||
} |
|
||||||
|
|
||||||
#undef xPRIMARY_MONITOR |
|
||||||
#undef COMPILE_MULTIMON_STUBS |
|
||||||
|
|
||||||
#else // COMPILE_MULTIMON_STUBS
|
|
||||||
|
|
||||||
extern int WINAPI xGetSystemMetrics(int); |
|
||||||
extern HMONITOR WINAPI xMonitorFromWindow(HWND, DWORD); |
|
||||||
extern HMONITOR WINAPI xMonitorFromRect(LPCRECT, DWORD); |
|
||||||
extern HMONITOR WINAPI xMonitorFromPoint(POINT, DWORD); |
|
||||||
extern BOOL WINAPI xGetMonitorInfo(HMONITOR, LPMONITORINFO); |
|
||||||
extern BOOL WINAPI xEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM); |
|
||||||
extern BOOL WINAPI xEnumDisplayDevices(PVOID, DWORD, PDISPLAY_DEVICE, DWORD); |
|
||||||
|
|
||||||
#endif // COMPILE_MULTIMON_STUBS
|
|
||||||
|
|
||||||
//
|
|
||||||
// build defines that replace the regular APIs with our versions
|
|
||||||
//
|
|
||||||
#define GetSystemMetrics xGetSystemMetrics |
|
||||||
#define MonitorFromWindow xMonitorFromWindow |
|
||||||
#define MonitorFromRect xMonitorFromRect |
|
||||||
#define MonitorFromPoint xMonitorFromPoint |
|
||||||
#define GetMonitorInfo xGetMonitorInfo |
|
||||||
#define EnumDisplayMonitors xEnumDisplayMonitors |
|
||||||
#define EnumDisplayDevices xEnumDisplayDevices |
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
} |
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue