有什么方法可以检测Windows中的监视器状态(打开还是关闭)?

有人知道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 的讨论,它表明没有可靠的方法。


还有其他想法吗?


叮当猫咪
浏览 1671回答 3
3回答

炎炎设计

GetDevicePowerState 有时适用于监视器。如果存在,则可以打开\\.\LCD设备。完成后立即将其关闭。本质上,您很不走运-没有可靠的方法来检测显示器的电源状态,缺少编写设备驱动程序以及过滤显示驱动器链上下的所有电源IRP的方法。而且也不是很可靠。

阿波罗的战车

你不能看起来所有连接到“电源安全模式”的显示器电源功能都经过搜索,我在这里找到了在SC_MONITORPOWER消息和系统值(第2个帖子)之间连接的代码,当我手动切换时,我使用该代码来测试系统值是否正在更改关闭显示器。int main(){&nbsp; &nbsp; for(;monitorOff()!=1;)&nbsp; &nbsp; &nbsp; &nbsp; Sleep(500);&nbsp; &nbsp; return 0;}//main而且无论我关闭显示器多长时间,代码都不会停止。有monitorOff功能的代码:int monitorOff(){&nbsp; &nbsp; const GUID MonitorClassGuid =&nbsp; &nbsp; &nbsp; &nbsp; {0x4d36e96e, 0xe325, 0x11ce,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};&nbsp; &nbsp; list<DevData> monitors;&nbsp; &nbsp; ListDeviceClassData(&MonitorClassGuid, monitors);&nbsp; &nbsp; list<DevData>::iterator it = monitors.begin(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it_end = monitors.end();&nbsp; &nbsp; for (; it != it_end; ++it)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; const char *off_msg = "";&nbsp; &nbsp; &nbsp; &nbsp; //it->PowerData.PD_PowerStateMapping&nbsp; &nbsp; &nbsp; &nbsp; if (it->PowerData.PD_MostRecentPowerState != PowerDeviceD0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }//for&nbsp; &nbsp; return 0;}//monitorOff结论:当您手动切换显示器时,您将无法通过Windows捕获它(如果没有异常的驱动程序界面),因为所有Windows功能都已连接到“电源安全模式”。
打开App,查看更多内容
随时随地看视频慕课网APP