ディスプレイデバイスを列挙する

Windows 2000以上で用意されているEnumDisplayDevicesを利用すると、そのPCにインストールされているディスプレイデバイスを一覧できる。

■取得結果例(マルチディスプレイ環境なのでQuadroが2つ列挙されている模様)
NVIDIA Quadro FX 2500M
NVIDIA Quadro FX 2500M
RDPDD Chained DD
RDP Encoder Mirror Driver


依存環境:ATL
#include "atlstr.h"
#include "atlcoll.h"

///
///\brief
///	ディスプレイデバイス名取得
///
///仮にディスプレイデバイスが1つでも以下のように1つ以上のデバイス名が取得されることがある
///
///	Windows 2000以降対応
///
///\param	astrDeviceName
///取得したデバイス名の配列
///
///\retval	true	
///\retval	false	
///
///-取得結果例1
///		- NeoMagic MagicGraph256AV driver
///		- NetMeeting driver
///		- RDPDD Chained DD
///-取得結果例2
///		- NVIDIA Quadro FX 2500M
///		- NVIDIA Quadro FX 2500M
///		- RDPDD Chained DD
///		- RDP Encoder Mirror Driver

bool	GetDisplayDeviceName(CAtlArray<CAtlString>& 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;

		astrDeviceName.Add(sDD.DeviceString);
		dwDevice++;
	}

	::FreeLibrary(hDLL);

	return	true;
}



bool	Test()
{
	size_t		i;
	size_t		nSize;

	CAtlArray<CAtlString>	astrName;

	GetDisplayDeviceName(astrName);

	nSize = astrName.GetCount();
	for(i = 0; i < nSize; i++)
	{
		ATLTRACE("%s\n",astrName[i]);
	}

	return	true;
}
プロジェクトファイルをダウンロード

カテゴリー「システム情報」 のエントリー