簡體   English   中英

有沒有辦法檢測顯示器是否插入?

[英]Is there a way to detect if a monitor is plugged in?

我有一個用 C++ 編寫的自定義應用程序,它控制連接到嵌入式系統的顯示器上的分辨率和其他設置。 有時系統是無頭啟動並通過 VNC 運行,但可以稍后(啟動后)插入監視器。 如果發生這種情況,在啟用監視器之前,他的監視器不會收到任何視頻。 我發現調用“displayswitch /clone”可以啟動顯示器,但我需要知道顯示器何時連接。 我有一個每 5 秒運行一次並查找監視器的計時器,但我需要一些 API 調用來告訴我監視器是否已連接。

這里有一些偽代碼來描述我所追求的(當計時器每 5 秒到期時執行什么)。

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

我曾嘗試GetSystemMetrics(SM_CMONITORS)返回監視器的數量,但如果監視器已連接,則返回 1。 還有其他想法嗎?

謝謝!

試試下面的代碼

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

如果 Windows 識別索引(AKA 標識)為0 (這是顯示控制面板內部使用的)的顯示設備,這將返回true 否則,它將返回 false false 因此,通過檢查第一個可能的索引(我將其標記為默認參數),您可以找出是否連接了任何顯示設備(或至少由 Windows 識別,這實際上是您要查找的)。

即使沒有連接真正的監視器,似乎也有某種“默認監視器”。 下面的功能對我有用(在英特爾 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM