判斷筆記本蓋子的打開狀態的方法(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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM