有没有办法检测显示器是否已插入?

时间:2013-01-11 21:06:21

标签: c++ windows winapi windows-shell shellexecute

我有一个用C ++编写的自定义应用程序,用于控制连接到嵌入式系统的监视器上的分辨率和其他设置。有时系统无头启动并通过VNC运行,但可以在以后插入监视器(启动后)。如果发生这种情况,则在启用监视器之前,监视器不会输入视频。我发现调用“displayswitch / clone”会启动监视器,但我需要知道监视器何时连接。我有一个每5秒运行一次的计时器并查找显示器,但是我需要一些API调用来告诉我显示器是否已连接。

这里有一些psudocode来描述我正在追求的东西(当计时器每5秒到期时执行什么)。

if(If monitor connected) 
{
   ShellExecute("displayswitch.exe /clone);
}else
{
   //Do Nothing
}

我已尝试GetSystemMetrics(SM_CMONITORS)来返回监视器的数量,但如果监视器已连接,则返回1。还有其他想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试以下代码

BOOL IsDisplayConnected(int displayIndex = 0)
{
    DISPLAY_DEVICE device;
    device.cb = sizeof(DISPLAY_DEVICE);
    return EnumDisplayDevices(NULL, displayIndex, &device, 0);
}

如果Windows识别出具有索引(AKA标识)true的显示设备(这是显示控制面板在内部使用的内容),则会返回0。否则,它将返回false false。因此,通过检查第一个可能的索引(我将其标记为默认参数),您可以了解任何显示设备是否已连接(或至少由Windows识别,这实际上是您正在查找的内容)对)。

答案 1 :(得分:0)

即使没有真正的监视器连接,似乎也存在某种“默认监视器”。 以下功能对我有用(在Intel NUC和Surface 5平板电脑上测试)。

这个想法是获取设备ID并检查它是否包含字符串“ default_monitor”。

bool hasMonitor()
{
    // Check if we have a monitor
    bool has = false;

    // Iterate over all displays and check if we have a valid one.
    //  If the device ID contains the string default_monitor no monitor is attached.
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);
    int deviceIndex = 0;
    while (EnumDisplayDevices(0, deviceIndex, &dd, 0))
    {
        std::wstring deviceName = dd.DeviceName;
        int monitorIndex = 0;
        while (EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
        {   
            size_t len = _tcslen(dd.DeviceID);
            for (size_t i = 0; i < len; ++i)
                dd.DeviceID[i] = _totlower(dd.DeviceID[i]);

            has = has || (len > 10 && _tcsstr(dd.DeviceID, L"default_monitor") == nullptr);

            ++monitorIndex;
        }
        ++deviceIndex;
    }

    return has;
}