windows-nt/Source/XPSP1/NT/multimedia/dshow/h/multmon.h
2020-09-26 16:20:57 +08:00

142 lines
4.2 KiB
C

// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
#ifdef COMPILE_MULTIMON_STUBS
#define COMPILE_MULTIMON_STUBS2
#endif
#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
#include <multimon.h>
//=============================================================================
//
// MULTIMON
// stub module that fakes multiple monitor apis on pre Memphis Win32 OSes
//
// By using this header your code will work unchanged on Win95,
// you will get back default values from GetSystemMetrics() for new metrics
// and the new APIs will act like only one display is present.
//
// exactly one source must include this with COMPILE_MULTIMON_STUBS defined
//
//=============================================================================
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */
#undef ChangeDisplaySettingsEx
//
// define this to compile the stubs
// otherwise you get the declarations
//
#ifdef COMPILE_MULTIMON_STUBS2
//-----------------------------------------------------------------------------
//
// Implement the API stubs.
//
//-----------------------------------------------------------------------------
BOOL (WINAPI* g_pfnChangeDisplaySettingsEx)(LPCSTR, LPDEVMODE, HWND, DWORD, LPVOID);
BOOL InitMultipleMonitorStubs2(void)
{
HMODULE hUser32;
static BOOL fInitDone;
if (fInitDone)
{
return g_pfnGetMonitorInfo != NULL;
}
if ((hUser32 = GetModuleHandle(TEXT("USER32"))) &&
#ifdef UNICODE
(*(FARPROC*)&g_pfnChangeDisplaySettingsEx = GetProcAddress(hUser32,"ChangeDisplaySettingsExW")) &&
#else
(*(FARPROC*)&g_pfnChangeDisplaySettingsEx = GetProcAddress(hUser32,"ChangeDisplaySettingsExA")) &&
#endif
//
// Old builds of Memphis had different indices for these metrics, and
// some of the APIs and structs have changed since then, so validate that
// the returned metrics are not totally messed up. (for example on an old
// Memphis build, the new index for SM_CYVIRTUALSCREEN will fetch 0)
//
// If this is preventing you from using the shell on secondary monitors
// under Memphis then upgrade to a new Memphis build that is in sync with
// the current version of the multi-monitor APIs.
//
(GetSystemMetrics(SM_CXVIRTUALSCREEN) >= GetSystemMetrics(SM_CXSCREEN)) &&
(GetSystemMetrics(SM_CYVIRTUALSCREEN) >= GetSystemMetrics(SM_CYSCREEN)) )
{
fInitDone = TRUE;
return TRUE;
}
else
{
g_pfnChangeDisplaySettingsEx = NULL ;
fInitDone = TRUE;
return FALSE;
}
}
#ifdef UNICODE
LONG WINAPI
xChangeDisplaySettingsExW(LPCSTR lpszDeviceName, LPDEVMODEW lpDevMode,
HWND hwnd, DWORD dwflags, LPVOID lParam)
{
if (InitMultipleMonitorStubs2())
return g_pfnChangeDisplaySettingsEx(lpszDeviceName, lpDevMode, hwnd,
dwflags, lParam) ;
// Otherwise return DISP_CHANGE_SUCCESSFUL, because OS doesn't support it
return DISP_CHANGE_SUCCESSFUL ; // what else?
}
#else
LONG WINAPI
xChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode,
HWND hwnd, DWORD dwflags, LPVOID lParam)
{
if (InitMultipleMonitorStubs2())
return g_pfnChangeDisplaySettingsEx(lpszDeviceName, lpDevMode, hwnd,
dwflags, lParam) ;
// Otherwise return DISP_CHANGE_SUCCESSFUL, because OS doesn't support it
return DISP_CHANGE_SUCCESSFUL ; // what else?
}
#endif // UNICODE
#undef COMPILE_MULTIMON_STUBS2
#else // COMPILE_MULTIMON_STUBS2
#ifdef UNICODE
extern LONG WINAPI xChangeDisplaySettingsExW(LPCSTR, LPDEVMODE, HWND, DWORD, LPVOID);
#else
extern LONG WINAPI xChangeDisplaySettingsExA(LPCSTR, LPDEVMODE, HWND, DWORD, LPVOID);
#endif
#endif // COMPILE_MULTIMON_STUBS2
//
// build defines that replace the regular APIs with our versions
//
#ifdef UNICODE
#define ChangeDisplaySettingsEx xChangeDisplaySettingsExW
#else
#define ChangeDisplaySettingsEx xChangeDisplaySettingsExA
#define ChangeDisplaySettingsExA xChangeDisplaySettingsExA
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) */