有没有人知道是否有一个API来获取Windows(XP/Vista/2000/2003)中的当前监视器状态(打开或关闭)?
我的所有搜索似乎都表明没有真正的方法可以做到这一点.
此线程尝试使用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}}; listmonitors; ListDeviceClassData(&MonitorClassGuid, monitors); list ::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捕获它(如果没有异常的驱动程序接口),因为所有窗口功能都连接到"电源安全模式".