为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2019-12-03 16:31:23
有人知道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 的讨论,它表明没有可靠的方法。还有其他想法吗?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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


本质上,您很不走运-没有可靠的方法来检测显示器的电源状态,缺少编写设备驱动程序以及过滤显示驱动器链上下的所有电源IRP的方法。而且也不是很可靠。


查看完整回答
反对 回复 2019-12-03
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

你不能


看起来所有连接到“电源安全模式”的显示器电源功能都

经过搜索,我在这里找到了在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功能都已连接到“电源安全模式”。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 1664 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信