在 C++ 中以编程方式识别笔记本电脑显示器与外部显示器

Identify laptop display vs external monitor programmatically in C++

我是我公司的 IT 人员,我们的许多用户对计算机知之甚少。我们有多个带码头和外部显示器的停靠站。因此,用户在移动到不同的站点时会遇到显示问题。监视器调整大小、复制或更改频率。

我使这个易于使用的一键式工具在控制台 C++ exe 中调整显示器大小。我 运行 涉及的问题是识别显示器是笔记本电脑显示器还是外接显示器。这很重要,因为我们所有的外接显示器都是 1920 x 1080,但我们的一些笔记本电脑是 1920 x 1200。

main.cpp:

#include <Windows.h>
#include <string>
#include <iostream>
int main()
{

    DEVMODE devmode;
    
    SetDisplayConfig(0, NULL, 0, NULL, SDC_TOPOLOGY_EXTEND | SDC_APPLY);
    

    //long result = ChangeDisplaySettings(&devmode, 0);

    DISPLAY_DEVICE displayDevice;
    displayDevice.cb = sizeof(displayDevice);
    int deviceIndex = 0;
    while (EnumDisplayDevices(0, deviceIndex, &displayDevice, 0))
    {
        std::wstring deviceName = displayDevice.DeviceName;
        int monitorIndex = 0;

        while (EnumDisplayDevices(deviceName.c_str(), monitorIndex, &displayDevice, 0))
        {            
            devmode.dmPelsWidth = 1920;
            devmode.dmPelsHeight = 1080;
            devmode.dmDisplayFrequency = 60;
            devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
            devmode.dmSize = sizeof(DEVMODE);

            long result = ChangeDisplaySettingsEx(deviceName.c_str(), &devmode, NULL, NULL, 0);
            ++monitorIndex;
        }
        ++deviceIndex;
    }
    return 0;
}

也许您正在寻找 displayDevice.StateFlags 字段中的 DISPLAY_DEVICE_REMOVABLE 标志?

Value Meaning
DISPLAY_DEVICE_REMOVABLE The device is removable; it cannot be the primary display.

https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-display_devicea