[英]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.