forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // 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;
 | |
| }
 |