Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get unique identifier for Windows monitors

Tags:

c++

winapi

I have a setup with two regular displays and three projectors connected to a windows pc. In my win32 program I need to uniquely identify each monitor and store information for each such that I can retrieve the stored information even after computer restart.

The EnumDisplayDevices seems to return different device orders after restarting the computer. There is also GetPhysicalMonitorsFromHMONITOR which at least gives me the display's name. However, I need something like a serial number for my projectors, since they are the same model. How can I get such a unique identifier?

EDIT: This is the solution I came up with after reading the answer from user Anders (thanks!):

DISPLAY_DEVICEA dispDevice;
ZeroMemory(&dispDevice, sizeof(dispDevice));
dispDevice.cb = sizeof(dispDevice);

DWORD screenID;
while (EnumDisplayDevicesA(NULL, screenID, &dispDevice, 0))
{
    // important: make copy of DeviceName
    char name[sizeof(dispDevice.DeviceName)];
    strcpy(name, dispDevice.DeviceName);

    if (EnumDisplayDevicesA(name, 0, &dispDevice, EDD_GET_DEVICE_INTERFACE_NAME))
    {
        // at this point dispDevice.DeviceID contains a unique identifier for the monitor
    }

    ++screenID;
}
like image 776
JustABit Avatar asked May 14 '18 12:05

JustABit


People also ask

Do monitors have unique identifiers?

The Unique Identifier for can be found using the Service Tag or the PPID (Serial Number) of the Dell monitor. The unique identifier will be the Service Tag of the Dell monitor. Previously, not all monitors supported Service Tags.

How do I find unique system ID?

To generate a mostly unique machine id, you can get a few serial numbers from various pieces of hardware on the system. Most processors will have a CPU serial number, the hard disks each have a number, and each network card will have a unique MAC address. You can get these and build a fingerprint for the machine.

Is Windows device ID unique?

Each device in Windows has it's own unique identifier known as the Hardware ID. The Device ID is the identifier of the PC itself.


1 Answers

EnumDisplayDevices with the EDD_GET_DEVICE_INTERFACE_NAME flag should give you a usable string. And if not, you can use this string with the SetupAPI to get the hardware id or driver key or whatever is unique enough for your purpose.

Set this flag to EDD_GET_DEVICE_INTERFACE_NAME (0x00000001) to retrieve the device interface name for GUID_DEVINTERFACE_MONITOR, which is registered by the operating system on a per monitor basis. The value is placed in the DeviceID member of the DISPLAY_DEVICE structure returned in lpDisplayDevice. The resulting device interface name can be used with SetupAPI functions and serves as a link between GDI monitor devices and SetupAPI monitor devices.

like image 162
Anders Avatar answered Sep 21 '22 02:09

Anders