본문 바로가기

C++

[C++] 모니터 이름 가져오기

 

모니터의 이름을 얻어 올 필요가 있을 때 사용합니다.

꼭 모니터의 이름만이 아니라 모니터와 관련된 정보를 필요로 할 때 사용할 수 있는 API 입니다.



    // Graphic Divice
	DISPLAY_DEVICE G_device;
	ZeroMemory(&G_device, sizeof(G_device));
	G_device.cb = sizeof(DISPLAY_DEVICE);
	DWORD deviceNum = 0;

	while (EnumDisplayDevices(NULL, deviceNum, &G_device, 0)) {
		// Monitor Divice
		DISPLAY_DEVICE M_device;
		ZeroMemory(&M_device, sizeof(M_device));
		M_device.cb = sizeof(DISPLAY_DEVICE);
		DWORD monitorNum = 0;

		while (EnumDisplayDevices(G_device.DeviceName, monitorNum, &M_device, 0))
		{
			// Current Monitor Info
			DEVMODE devmode{};
			devmode.dmSize = sizeof(DEVMODE);
			EnumDisplaySettings(G_device.DeviceName, ENUM_CURRENT_SETTINGS, &devmode);
			
			std::wstring temp = M_device.DeviceID; 
			std::wstring name = temp.substr(8, 7); // 모니터 이름
			devmode; // <- 모니터의 각종 정보
			monitorNum++;
		}
		deviceNum++;
	}

 

 

먼저 EnumDisplayDevices() 함수에 대해 이해해야 하는데 MSDN에 있는 정보는 아래와 같습니다.

 

https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-enumdisplaydevicesa?redirectedfrom=MSDN

 

EnumDisplayDevices() 이 함수를 통해 현재 세션의 디스플레이 디바이스에 대한 정보를 가져올 수 있습니다.

BOOL EnumDisplayDevicesA(
  [in]  LPCSTR           lpDevice,
  [in]  DWORD            iDevNum,
  [out] PDISPLAY_DEVICEA lpDisplayDevice,
  [in]  DWORD            dwFlags
);

 

디스플레이 모니터에 대한 정보를 가져오려면 먼저 lpDevice NULL로 설정된 EnumDisplayDevices를 호출합니다.

그런 다음 lpDevice DISPLAY_DEVICE 설정된 EnumDisplayDevices를 호출합니다. 

EnumDisplayDevices  iDevNum이 0으로 설정된 첫 번째 호출의 DeviceName입니다.

그런 다음 DISPLAY_DEVICE. DeviceString 은 모니터 이름입니다.

 

 

네.. 저도 뭔말인지 잘 모르겠습니다.


 

위 방법대로 DeviceString

의 정보만 접근하면

 

L"Generic PnP Monitor"

L"\\\\.\\DISPLAY1"

 

이런 값을 주긴 주는데 작성자는 구분가능한 정보를 얻고싶었습니다.

 

위 코드를 보시면 EnumDisplayDevices가 While 문을 통해 두번 타는 것이 보일 것입니다.

첫 반복문은 모니터 어댑터의 정보를 가져 옵니다.

 

이 정보로만으로도 모니터의 정보에 접근이 가능하지만 저희는 이름을 알기 위해서 다시한번 처음 얻은 DISPLAY_DEVICE 정보를 가지고 EnumDisplayDevices에 한번더 정보를 가져옵니다.

그리고 다시 만들어진 DISPLAY_DEVICE정보에 DeviceID를 보면

 

L"MONITOR\\MSI3CB5\\{4d36e96e-e325-11ce-bfc1-08002be10318}\\0002"

 

이런 값이 나오는데 MSI3CB5 이 부분이 모니터의 이름입니다.

이 값을 substr(8, 7)를 태워서 잘라주면 이쁘게 이름만 확인 할 수 있습니다.

 

작성 당시 작성자의 모니터 이름 그리고 해상도와 주모니터 정보도 같이 출력 해봤습니다.

 

이런게 왜 필요할까 싶겠지만 또 모르죠 쓸일이 있을지..