有什么办法来检测Windows中的监视器状态(开或关)?

有没有人知道是否有一个API来获取Windows(XP / Vista / 2000/2003)当前的监视器状态(打开或closures)?

我所有的search似乎都表明,没有真正的做法。

此线程尝试使用根据Microsoft的文档GetDevicePowerState不适用于显示设备。

在Vista中,我可以收听GUID_MONITOR_POWER_ON,但是当手动closures显示器时,我似乎没有收到任何事件。

在XP中,我可以挂钩到WM_SYSCOMMAND SC_MONITORPOWER ,寻找状态2.这只适用于系统触发电源closures的情况。

WMI Win32_DesktopMonitor类似乎也没有帮助。

编辑 :这是一个关于comp.os.ms-windows.programmer.win32 的讨论 ,指出没有可靠的方法来做到这一点。

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

GetDevicePowerState 有时适用于显示器。 如果存在,您可以打开\\。\ LCD设备。 完成后立即closures它。

从根本上讲,你不走运 – 没有可靠的方法来检测显示器电源状态,没有写一个设备驱动程序,并过滤显示驱动器链上的所有电源IRP。 这也不是很可靠。

你可以挂上一个networking摄像头,把它指向你的屏幕,并对你收到的图像做一些分析;)

在根据显示器状态做任何事情之前,只要记住用户可以使用其他系统的远程桌面机器,而不需要连接到机器的显示器 – 所以不要根据显示器状态closures任何可视化。

你不能。

看起来像所有连接到“电源安全模式”的监视器电源function
search后,我发现在这里代码连接SC_MONITORPOWER消息和系统值( 邮编 2)
我使用代码来testing当我手动closures显示器时系统值是否正在改变。

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

而且代码永远不会停止,不pipe我关掉显示器多久。
有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 

结论:当您手动切换显示器时, 您无法通过窗口 (如果没有不寻常的驱动程序界面) 捕捉它 ,因为所有窗口function都连接到“电源安全模式”

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

请参阅http://msdn.microsoft.com/en-us/library/dd376775(VS.85).aspx

(不知道这是否在2003年Sever)

如果您的显示器具有某种内置USB集线器,则可以尝试使用该集线器来检测显示器是否closures/打开。
如果在监视器被认为“closures”的情况下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中待机时监视几何graphics:

 Monitor0: 1637792, 4210405, 31266576, 1637696 

在DeplhiXE中待机时监视几何graphics:

 Monitor0: 4211194, 40, 1637668, 1637693 

这是一个非常旧的post,但如果它可以帮助某人,我已经find了一个解决scheme来检测屏幕可用或不可用:Windows的连接和configuration显示(CCD)API。

它是User32.ddl的一部分,有趣的函数是GetDisplayConfigBufferSizesQueryDisplayConfig 。 它给我们所有的信息,可以在窗口的configuration面板中查看。

特别是PathInfo包含具有targetAvailable标志的TargetInfo属性。 这个标志似乎正确地更新了我迄今尝试的所有configuration。

这可以让您了解连接到PC的每个屏幕的状态并设置其configuration。

这里是一个.net的CCD包装器