모니터의 이름을 얻어 올 필요가 있을 때 사용합니다.
꼭 모니터의 이름만이 아니라 모니터와 관련된 정보를 필요로 할 때 사용할 수 있는 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에 있는 정보는 아래와 같습니다.
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)를 태워서 잘라주면 이쁘게 이름만 확인 할 수 있습니다.
작성 당시 작성자의 모니터 이름 그리고 해상도와 주모니터 정보도 같이 출력 해봤습니다.
이런게 왜 필요할까 싶겠지만 또 모르죠 쓸일이 있을지..