当前位置:  开发笔记 > 开发工具 > 正文

有没有办法在Windows中检测监视器状态(打开或关闭)?

如何解决《有没有办法在Windows中检测监视器状态(打开或关闭)?》经验,为你挑选了4个好方法。

有没有人知道是否有一个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 的讨论,表明没有可靠的方法来做到这一点.

其他人还有其他想法吗?



1> thijs..:

您可以连接网络摄像头,将其指向您的屏幕并对您收到的图像进行一些分析;)


但是你可能会误认为屏幕操作的反射..我认为你正在将设备驱动程序问题转变为图像处理问题..我喜欢它:)
该技术已用于监控远程位置的设备机架.将相机对准机架,并注意指示灯中的"异常"变化.它的蛮力,但在某些情况下,它是唯一合理的答案.

2> Roger Lipsco..:

GetDevicePowerState 有时适用于监视器.如果它存在,您可以打开\\.\ LCD设备.完成后立即关闭它.

基本上,你运气不好 - 没有可靠的方法来检测显示器电源状态,没有写入设备驱动程序并在显示驱动链上上下过滤所有电源IRP.这也不是很可靠.



3> Nir..:

在根据监视器状态执行任何操作之前,请记住,用户可以使用具有其他系统的远程桌面的计算机,这些计算机不需要连接到计算机的监视器 - 因此请勿根据监视器状态关闭任何可视化.



4> Avram..:

你不能.

看起来像连接到"电源安全模式"的所有显示器电源功能
搜索后我发现这里的代码连接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 monitors;
    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捕获它(如果没有异常的驱动程序接口),因为所有窗口功能都连接到"电源安全模式".

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有