//------------------------------------------------------------------------------ | |
// File: DDMM.cpp | |
// | |
// Desc: DirectShow base classes - implements routines for using DirectDraw | |
// on a multimonitor system. | |
// | |
// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved. | |
//------------------------------------------------------------------------------ | |
#include <streams.h> | |
#include <ddraw.h> | |
#include "ddmm.h" | |
/* | |
* FindDeviceCallback | |
*/ | |
typedef struct { | |
LPSTR szDevice; | |
GUID* lpGUID; | |
GUID GUID; | |
BOOL fFound; | |
} FindDeviceData; | |
BOOL CALLBACK FindDeviceCallback(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam) | |
{ | |
FindDeviceData *p = (FindDeviceData*)lParam; | |
if (lstrcmpiA(p->szDevice, szDevice) == 0) { | |
if (lpGUID) { | |
p->GUID = *lpGUID; | |
p->lpGUID = &p->GUID; | |
} else { | |
p->lpGUID = NULL; | |
} | |
p->fFound = TRUE; | |
return FALSE; | |
} | |
return TRUE; | |
} | |
BOOL CALLBACK FindDeviceCallbackEx(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam, HMONITOR hMonitor) | |
{ | |
FindDeviceData *p = (FindDeviceData*)lParam; | |
if (lstrcmpiA(p->szDevice, szDevice) == 0) { | |
if (lpGUID) { | |
p->GUID = *lpGUID; | |
p->lpGUID = &p->GUID; | |
} else { | |
p->lpGUID = NULL; | |
} | |
p->fFound = TRUE; | |
return FALSE; | |
} | |
return TRUE; | |
} | |
/* | |
* DirectDrawCreateFromDevice | |
* | |
* create a DirectDraw object for a particular device | |
*/ | |
IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP) | |
{ | |
IDirectDraw* pdd = NULL; | |
FindDeviceData find; | |
if (szDevice == NULL) { | |
DirectDrawCreateP(NULL, &pdd, NULL); | |
return pdd; | |
} | |
find.szDevice = szDevice; | |
find.fFound = FALSE; | |
DirectDrawEnumerateP(FindDeviceCallback, (LPVOID)&find); | |
if (find.fFound) | |
{ | |
// | |
// In 4bpp mode the following DDraw call causes a message box to be popped | |
// up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we | |
// make sure it doesn't happen. | |
// | |
UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); | |
DirectDrawCreateP(find.lpGUID, &pdd, NULL); | |
SetErrorMode(ErrorMode); | |
} | |
return pdd; | |
} | |
/* | |
* DirectDrawCreateFromDeviceEx | |
* | |
* create a DirectDraw object for a particular device | |
*/ | |
IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP) | |
{ | |
IDirectDraw* pdd = NULL; | |
FindDeviceData find; | |
if (szDevice == NULL) { | |
DirectDrawCreateP(NULL, &pdd, NULL); | |
return pdd; | |
} | |
find.szDevice = szDevice; | |
find.fFound = FALSE; | |
DirectDrawEnumerateExP(FindDeviceCallbackEx, (LPVOID)&find, | |
DDENUM_ATTACHEDSECONDARYDEVICES); | |
if (find.fFound) | |
{ | |
// | |
// In 4bpp mode the following DDraw call causes a message box to be popped | |
// up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we | |
// make sure it doesn't happen. | |
// | |
UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); | |
DirectDrawCreateP(find.lpGUID, &pdd, NULL); | |
SetErrorMode(ErrorMode); | |
} | |
return pdd; | |
} |