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;
							 | 
						||
| 
								 | 
							
								}
							 |