普通的應用程式是接收不到筆記本蓋子的狀態的訊息的, 應用程式必須向系統註冊後才能收到該訊息.
我使用這個訊息的原因是, 我想在筆記本蓋子合上後禁用鍵盤和滑鼠, 以免誤操作.
要註冊該訊息, 使用 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