ビデオカード名取得(Win2000)

解説


 EnumDisplayDevicesを利用して取得する。
 本当はEnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);のようにして列挙する必要が ある。しかし面倒なのでエラーになるまでループすることで列挙している。


ソースコード


#include "atlstr.h"
#include "ArrayEx.h"

#define	CAtlStringArray	CArrayEx

//
//	ディスプレイデバイス名取得
//
//	Windows 2000以降対応
//
//仮にディスプレイデバイスが1つでも以下のように1つ以上のデバイス名が取得されることがある
//
//	NeoMagic MagicGraph256AV driver
//	NetMeeting driver
//	RDPDD Chained DD
//
bool	GetDisplayDeviceName(CAtlStringArray& astrDeviceName)
{
	HMODULE			hDLL;
	BOOL			ret;
	DWORD			dwDevice;
	DISPLAY_DEVICE	sDD;

	BOOL (CALLBACK* pfnEnumDisplayDevices)(PVOID Unused,DWORD iDevNum,PDISPLAY_DEVICE lpDisplayDevice,DWORD dwFlags);

	astrDeviceName.RemoveAll();

	hDLL = ::LoadLibrary(_T("user32.dll"));
	if(hDLL == NULL)
		return	false;

#ifdef _UNICODE
	(FARPROC&)pfnEnumDisplayDevices = ::GetProcAddress(hDLL,"EnumDisplayDevicesW");
#else
	(FARPROC&)pfnEnumDisplayDevices = ::GetProcAddress(hDLL,"EnumDisplayDevicesA");
#endif

	if(pfnEnumDisplayDevices == NULL)
	{
		::FreeLibrary(hDLL);
		return	false;
	}

	dwDevice = 0;
	while(1)
	{
		ZeroMemory(&sDD,sizeof(DISPLAY_DEVICE));
		sDD.cb = sizeof(DISPLAY_DEVICE);

		//dwDevice番目のディスプレイデバイスを取得
		ret = pfnEnumDisplayDevices(NULL,dwDevice,&sDD,0);
		if(ret == FALSE)
			break;

		ATLTRACE(_T("%s\n"),sDD.DeviceString);
		astrDeviceName.Add(sDD.DeviceString);
		dwDevice++;
	}

	::FreeLibrary(hDLL);

	return	true;
}

カテゴリー「VC++ TIPS」 のエントリー