[英]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
的一部分,有趣的函數是GetDisplayConfigBufferSizes
和QueryDisplayConfig
。 它為我們提供了可以在窗口的配置面板中查看的所有信息。
特別是PathInfo
包含具有targetAvailable
標志的TargetInfo
屬性。 到目前為止,我嘗試過的所有配置似乎都正確更新了此標志。
這使您可以了解連接到 PC 的每個屏幕的狀態並設置其配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.