簡體   English   中英

有沒有辦法檢測 Windows 中的監視器狀態(打開或關閉)?

[英]Is there any way to detect the monitor state in Windows (on or off)?

有誰知道在 Windows (XP/Vista/2000/2003) 中是否有一個 API 來獲取當前的監視器狀態(打開或關閉)?

我所有的搜索似乎都表明沒有真正的方法可以做到這一點。

該線程嘗試使用GetDevicePowerState ,根據 Microsoft 的文檔,它不適用於顯示設備。

在 Vista 中,我可以收聽GUID_MONITOR_POWER_ON但在手動關閉監視器時我似乎沒有收到事件。

在 XP 中,我可以連接到WM_SYSCOMMAND SC_MONITORPOWER ,尋找狀態 2。這僅適用於系統觸發電源關閉的情況。

WMI Win32_DesktopMonitor類似乎也沒有幫助。

編輯:這是關於 comp.os.ms-windows.programmer.win32 的討論,表明沒有可靠的方法可以做到這一點。

其他人有任何其他想法嗎?

GetDevicePowerState有時適用於監視器。 如果存在,您可以打開\\\\.\\LCD設備。 完成后立即關閉它。

從本質上講,您很不走運——沒有可靠的方法來檢測顯示器電源狀態,除非編寫設備驅動程序並過濾顯示驅動程序鏈上下的所有電源 IRP。 而且這也不是很可靠。

您可以連接網絡攝像頭,將其對准屏幕並對收到的圖像進行一些分析;)

在根據監視器狀態做任何事情之前,請記住,用戶可以使用具有其他系統遠程桌面的機器,不需要將監視器連接到機器 - 所以不要關閉任何基於監視器狀態的可視化。

你不能。

看起來所有顯示器電源功能都連接到“電源安全模式”
搜索后,我在 這里找到 連接SC_MONITORPOWER消息和系統值的代碼(帖子編號 2)
我使用代碼來測試當我手動關閉顯示器時系統值是否發生變化。

int main()
{
    for(;monitorOff()!=1;)
        Sleep(500);
    return 0;
}//main

無論我關閉顯示器多久,代碼都不會停止。
有monitorOff函數的代碼:

int monitorOff()
{
    const GUID MonitorClassGuid =
        {0x4d36e96e, 0xe325, 0x11ce, 
            {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};

    list<DevData> monitors;
    ListDeviceClassData(&MonitorClassGuid, monitors);

    list<DevData>::iterator it = monitors.begin(),
                            it_end = monitors.end();
    for (; it != it_end; ++it)
    {
        const char *off_msg = "";

        //it->PowerData.PD_PowerStateMapping
        if (it->PowerData.PD_MostRecentPowerState != PowerDeviceD0)
        {
            return 1;
        }
    }//for

    return 0;
}//monitorOff

結論:當您手動切換顯示器時,您無法通過 windows 捕捉到它(如果沒有異常的驅動程序接口),因為所有 windows 功能都連接到“電源安全模式”

在 Windows XP 或更高版本中,您可以使用 IMSVidDevice 接口。

請參閱http://msdn.microsoft.com/en-us/library/dd376775(VS.85).aspx

(不確定這是否適用於 Sever 2003)

如果您的顯示器有某種內置的 USB 集線器,您可以嘗試使用它來檢測顯示器是否關閉/打開。
這當然只有在顯示器被認為“關閉”時 USB 集線器沒有保持連接的情況下才有效。

使用 Delphi 代碼,您可以在待機期間檢測無效的監視器幾何體:

i := 0
('Monitor'+IntToStr(i)+': '+IntToStr(Screen.Monitors[i].BoundsRect.Left)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Top)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Right)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Bottom))

結果:

待機前監控幾何:

Monitor0: 0, 0, 1600, 900

在 Deplhi7 中待機時監控幾何:

Monitor0: 1637792, 4210405, 31266576, 1637696

在 DeplhiXE 中待機時監控幾何:

Monitor0: 4211194, 40, 1637668, 1637693

這是一篇很老的帖子,但如果它可以幫助某人,我找到了一種檢測屏幕可用與否的解決方案:Windows 的連接和配置顯示器 (CCD) API。

它是User32.ddl的一部分,有趣的函數是GetDisplayConfigBufferSizesQueryDisplayConfig 它為我們提供了可以在窗口的配置面板中查看的所有信息。

特別是PathInfo包含具有targetAvailable標志的TargetInfo屬性。 到目前為止,我嘗試過的所有配置似乎都正確更新了此標志。

這使您可以了解連接到 PC 的每個屏幕的狀態並設置其配置。

這是 .Net 的 CCD 包裝器

暫無
暫無

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

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