zoukankan      html  css  js  c++  java
  • 判断笔记本盖子的打开状态的方法(RegisterPowerSettingNotification,GUID_LIDSWITCH_STATE_CHANGE)

      普通的应用程序是接收不到笔记本盖子的状态的消息的, 应用程序必须向系统注册后才能收到该消息.
      我使用这个消息的原因是, 我想在笔记本盖子合上后禁用键盘和鼠标, 以免误操作.

      要注册该消息, 使用 RegisterPowerSettingNotification 函数, 其中的GUID指定为 GUID_LIDSWITCH_STATE_CHANGE.
      应用程序退出时必须要取消该注册消息, 使用 UnregisterPowerSettingNotification.

      示例程序:
        在应用程序初始化时注册消息:
          HPOWERNOTIFY hPowerNotify;
          hPowerNotify = RegisterPowerSettingNotification(hWnd,&GUID_LIDSWITCH_STATE_CHANGE,DEVICE_NOTIFY_WINDOW_HANDLE);
        在应用程序退出时取消注册,要在注册时的窗口被Destroy之前哦:
          UnregisterPowerSettingNotification(hPowerNotify);

      向系统注册后,就会在窗口过程中收到盖子状态的消息了:
        uMsg:WM_POWERBROADCAST
        wParam:PBT_POWERSETTINGCHANGE
        lParam:POWERBROADCAST_SETTING*

      可以按如下方式处理:

    LRESULT __stdcall WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        if(uMsg == WM_POWERBROADCAST){
            if(wParam==PBT_POWERSETTINGCHANGE){
                POWERBROADCAST_SETTING* ppbs = (POWERBROADCAST_SETTING*)lParam;
                if(memcmp(&ppbs->PowerSetting,&GUID_LIDSWITCH_STATE_CHANGE,sizeof(GUID))==0){
                    unsigned int lid_state = *(unsigned int*)ppbs->Data;
                    if(lid_state == 1){
                        //盖子是打开的
                    }else{
                        //盖子是合上的
                    }
                }
                return 0;
            }
        }
        //...
    }

    注意, 该方式处理起来不会有什么错误, 但是需要注意, 如果笔记本有外接显示器的话, 这个判断就不能完全说明电脑没有显示了, 只是本子自身的那个显示器状态变化了而已. 所以还需要检测是否有外接显示器.

    判断是否有外接显示器的方法:
      http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/95a8da10-a191-4438-9e87-dffa546a665c
    也可以使用:GetSystemMetrics(SM_CMONITORS), 至于它与 EnumDisplayMonitors 的区别,详见:
      http://msdn.microsoft.com/en-us/library/windows/desktop/dd162610%28v=vs.85%29.aspx

    另:MSDN上说这个函数最小的系统版本要求为Windows Vista, 所以在XP下面的判断方法尚不清楚.

    女孩不哭 @ 2013-05-30 03:06:41 @ http://www.cnblogs.com/nbsofer


  • 相关阅读:
    Java序列化与反序列化
    Java中的反射机制
    Java中读文件操作
    Java中写文件操作
    判断单链表是否有环
    Java继承与组合
    Java类初始化
    堆排序
    希尔排序
    插入排序
  • 原文地址:https://www.cnblogs.com/memset/p/3107364.html
Copyright © 2011-2022 走看看