首页 > 代码库 > 一个简单的阻止笔记本合上盖子休眠的程序
一个简单的阻止笔记本合上盖子休眠的程序
用来练手,顺便自己拿来用。。。
1 /*---------------------------------------- 2 Keep your Notebook awake when Lid is closed. 3 (c) LJN, 2014 4 ----------------------------------------*/ 5 6 //Improve: Lock your computer when Lid is closed. 7 8 #include <windows.h> 9 #include <powrprof.h> 10 #include <process.h> 11 #include "resource.h" 12 #pragma comment(lib, "powrprof.lib") 13 14 #define IDM_TRAY 1 15 #define IDN_TRAY 2 16 #define IDM_SLEEP 3 17 #define IDM_QUIT 4 18 #define WM_TRAY WM_USER + 1 19 20 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 21 VOID Thread (PVOID); 22 23 BOOL fCurrent; 24 25 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 26 PSTR szCmdLine, int iCmdShow) 27 { 28 static TCHAR szAppName[] = TEXT ("Sleep-Manager"); 29 HWND hwnd; 30 MSG msg; 31 WNDCLASS wndclass; 32 HANDLE hMutex; 33 34 hMutex = CreateMutex (NULL, FALSE, szAppName); 35 if (GetLastError () == ERROR_ALREADY_EXISTS) 36 { 37 MessageBox (NULL, TEXT ("Sorry, Sleep Manager has already run."), 38 TEXT ("Error"), MB_ICONERROR); 39 return 0; 40 } 41 42 wndclass.style = CS_HREDRAW | CS_VREDRAW; 43 wndclass.lpfnWndProc = WndProc; 44 wndclass.cbClsExtra = 0; 45 wndclass.cbWndExtra = 0; 46 wndclass.hInstance = hInstance; 47 wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_APP_ICON)); 48 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); 49 wndclass.hbrBackground = (HBRUSH) (GetStockObject (WHITE_BRUSH)); 50 wndclass.lpszMenuName = NULL; 51 wndclass.lpszClassName = szAppName; 52 RegisterClass (&wndclass); 53 54 hwnd = CreateWindow (szAppName, szAppName, 55 WS_OVERLAPPEDWINDOW, 56 CW_USEDEFAULT, CW_USEDEFAULT, 57 CW_USEDEFAULT, CW_USEDEFAULT, 58 NULL, NULL, hInstance, NULL); 59 60 while (GetMessage (&msg, NULL, 0, 0)) 61 { 62 TranslateMessage (&msg); 63 DispatchMessage (&msg); 64 } 65 66 ReleaseMutex (hMutex); 67 68 return (int) msg.wParam; 69 } 70 71 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 72 { 73 static HINSTANCE hInstance; 74 static HMENU hMenu; 75 static NOTIFYICONDATA Notify; 76 static POINT pt; 77 78 static HPOWERNOTIFY hPowerSchemeNotify, hPowerSourceNotify; 79 PPOWERBROADCAST_SETTING ppbs; 80 81 static DWORD fAC_restore, fDC_restore, fPlugged; 82 static GUID *pguid; // a pointer to a pointer 83 SYSTEM_POWER_STATUS sysPowerStatus; 84 85 TCHAR szAppName[] = TEXT ("Sleep Manager\t© 2014 LJN"); 86 static TCHAR szSleepTip[] = TEXT ("Sleep Mode"); 87 static TCHAR szAwakeTip[] = TEXT ("Awake Mode"); 88 static TCHAR szSleepInfo[] = TEXT ("Sleep when your lid is closed.\nAll settings will be restored after you quit."); 89 static TCHAR szAwakeInfo[] = TEXT ("Keep awake when your lid is closed.\nAll settings will be restored after you quit."); 90 91 switch (message) 92 { 93 case WM_CREATE: 94 95 _beginthread (Thread, 0, NULL) ; 96 hInstance = ((LPCREATESTRUCT) lParam) -> hInstance; 97 98 GetSystemPowerStatus (&sysPowerStatus); 99 fPlugged = sysPowerStatus.ACLineStatus ? TRUE : FALSE;100 101 hPowerSchemeNotify = RegisterPowerSettingNotification (hwnd,102 &GUID_ACTIVE_POWERSCHEME, DEVICE_NOTIFY_WINDOW_HANDLE);103 hPowerSourceNotify = RegisterPowerSettingNotification (hwnd,104 &GUID_ACDC_POWER_SOURCE, DEVICE_NOTIFY_WINDOW_HANDLE);105 106 PowerGetActiveScheme (NULL, &pguid);107 PowerReadACValueIndex (NULL, pguid,108 &GUID_SYSTEM_BUTTON_SUBGROUP,109 &GUID_LIDCLOSE_ACTION,110 &fAC_restore);111 PowerReadDCValueIndex (NULL, pguid,112 &GUID_SYSTEM_BUTTON_SUBGROUP,113 &GUID_LIDCLOSE_ACTION,114 &fDC_restore);115 116 if (fPlugged) fCurrent = fAC_restore;117 else fCurrent = fDC_restore;118 119 hMenu = CreatePopupMenu ();120 if (fPlugged) AppendMenu (hMenu, MF_STRING, IDM_SLEEP, TEXT ("AC Mode Sleep"));121 else AppendMenu (hMenu, MF_STRING, IDM_SLEEP, TEXT ("DC Mode Sleep"));122 AppendMenu (hMenu, MF_SEPARATOR, 0, 0);123 AppendMenu (hMenu, MF_STRING, IDM_QUIT, TEXT ("Quit"));124 125 Notify.cbSize = (DWORD) sizeof (NOTIFYICONDATA);126 Notify.hWnd = hwnd;127 Notify.uID = IDN_TRAY;128 Notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;129 Notify.uCallbackMessage = WM_TRAY;130 Notify.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;131 wcscpy_s (Notify.szInfoTitle, sizeof szAppName, szAppName);132 133 if (fCurrent)134 {135 Notify.hIcon = Notify.hBalloonIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_TRAY_ICON));136 wcscpy_s (Notify.szTip, sizeof szSleepTip, szSleepTip);137 wcscpy_s (Notify.szInfo, sizeof szSleepInfo, szSleepInfo);138 }139 else140 {141 Notify.hIcon = Notify.hBalloonIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_DISABLED_ICON));142 wcscpy_s (Notify.szTip, sizeof szAwakeTip, szAwakeTip);143 wcscpy_s (Notify.szInfo, sizeof szAwakeInfo, szAwakeInfo);144 }145 Shell_NotifyIcon (NIM_ADD, &Notify);146 Notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;147 148 return 0;149 150 case WM_TRAY:151 152 switch (lParam)153 {154 case WM_LBUTTONUP:155 156 fCurrent = fCurrent ? FALSE : TRUE;157 158 if (fPlugged)159 PowerWriteACValueIndex (NULL, pguid,160 &GUID_SYSTEM_BUTTON_SUBGROUP,161 &GUID_LIDCLOSE_ACTION,162 fCurrent);163 else164 PowerWriteDCValueIndex (NULL, pguid,165 &GUID_SYSTEM_BUTTON_SUBGROUP,166 &GUID_LIDCLOSE_ACTION,167 fCurrent);168 PowerSetActiveScheme (NULL, pguid);169 170 if (fCurrent)171 {172 Notify.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_TRAY_ICON));173 wcscpy_s (Notify.szTip, sizeof szSleepTip, szSleepTip);174 }175 else176 {177 Notify.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_DISABLED_ICON));178 wcscpy_s (Notify.szTip, sizeof szAwakeTip, szAwakeTip);179 }180 Shell_NotifyIcon (NIM_MODIFY, &Notify);181 182 break;183 184 case WM_RBUTTONUP:185 186 if (fPlugged)187 {188 if (fCurrent) ModifyMenu (hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_CHECKED, IDM_SLEEP, TEXT ("AC Mode Sleep"));189 else ModifyMenu (hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_UNCHECKED, IDM_SLEEP, TEXT ("AC Mode Sleep"));190 }191 else192 {193 if (fCurrent) ModifyMenu (hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_CHECKED, IDM_SLEEP, TEXT ("DC Mode Sleep"));194 else ModifyMenu (hMenu, IDM_SLEEP, MF_BYCOMMAND | MF_UNCHECKED, IDM_SLEEP, TEXT ("DC Mode Sleep"));195 }196 197 SetForegroundWindow (hwnd);198 GetCursorPos (&pt);199 TrackPopupMenu (hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);200 201 break;202 } 203 return 0;204 205 case WM_COMMAND:206 case WM_SYSCOMMAND:207 208 switch (LOWORD (wParam))209 {210 case IDM_SLEEP:211 SendMessage (hwnd, WM_TRAY, 0, WM_LBUTTONUP);212 return 0;213 214 case IDM_QUIT:215 SendMessage (hwnd, WM_DESTROY, 0, 0);216 return 0;217 }218 break;219 220 case WM_POWERBROADCAST:221 222 switch (wParam)223 {224 case PBT_POWERSETTINGCHANGE:225 226 ppbs = (POWERBROADCAST_SETTING*) lParam;227 if (!memcmp (&ppbs -> PowerSetting, &GUID_ACTIVE_POWERSCHEME, sizeof (GUID)))228 {229 PowerWriteACValueIndex (NULL, pguid,230 &GUID_SYSTEM_BUTTON_SUBGROUP,231 &GUID_LIDCLOSE_ACTION,232 fAC_restore);233 PowerWriteDCValueIndex (NULL, pguid,234 &GUID_SYSTEM_BUTTON_SUBGROUP,235 &GUID_LIDCLOSE_ACTION,236 fDC_restore);237 LocalFree (pguid);238 239 PowerGetActiveScheme (NULL, &pguid);240 PowerReadACValueIndex (NULL, pguid,241 &GUID_SYSTEM_BUTTON_SUBGROUP,242 &GUID_LIDCLOSE_ACTION,243 &fAC_restore);244 PowerReadDCValueIndex (NULL, pguid,245 &GUID_SYSTEM_BUTTON_SUBGROUP,246 &GUID_LIDCLOSE_ACTION,247 &fDC_restore);248 249 if (fPlugged) fCurrent = fAC_restore;250 else fCurrent = fDC_restore;251 }252 else if (!memcmp (&ppbs -> PowerSetting, &GUID_ACDC_POWER_SOURCE, sizeof (GUID)))253 {254 GetSystemPowerStatus (&sysPowerStatus);255 fPlugged = sysPowerStatus.ACLineStatus ? TRUE : FALSE;256 257 if (fPlugged)258 {259 PowerWriteDCValueIndex (NULL, pguid,260 &GUID_SYSTEM_BUTTON_SUBGROUP,261 &GUID_LIDCLOSE_ACTION,262 fDC_restore);263 fCurrent = fAC_restore;264 }265 else266 {267 PowerWriteACValueIndex (NULL, pguid,268 &GUID_SYSTEM_BUTTON_SUBGROUP,269 &GUID_LIDCLOSE_ACTION,270 fAC_restore);271 fCurrent = fDC_restore;272 }273 }274 else275 {276 MessageBox (NULL, TEXT ("Sorry, Your Power Scheme has changed in an unexpected way."),277 NULL, MB_ICONERROR);278 break;279 }280 281 //Fall Through282 if (fCurrent)283 {284 Notify.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_TRAY_ICON));285 wcscpy_s (Notify.szTip, sizeof szSleepTip, szSleepTip);286 }287 else288 {289 Notify.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_DISABLED_ICON));290 wcscpy_s (Notify.szTip, sizeof szAwakeTip, szAwakeTip);291 }292 Shell_NotifyIcon (NIM_MODIFY, &Notify);293 }294 return 0;295 296 case WM_QUERYENDSESSION:297 case WM_DESTROY:298 299 PowerWriteACValueIndex (NULL, pguid,300 &GUID_SYSTEM_BUTTON_SUBGROUP,301 &GUID_LIDCLOSE_ACTION,302 fAC_restore);303 PowerWriteDCValueIndex (NULL, pguid,304 &GUID_SYSTEM_BUTTON_SUBGROUP,305 &GUID_LIDCLOSE_ACTION,306 fDC_restore);307 PowerSetActiveScheme (NULL, pguid);308 LocalFree (pguid);309 310 DestroyMenu (hMenu) ;311 Shell_NotifyIcon (NIM_DELETE, &Notify) ;312 UnregisterPowerSettingNotification (hPowerSchemeNotify);313 UnregisterPowerSettingNotification (hPowerSourceNotify);314 315 PostQuitMessage (0);316 return 0;317 }318 return DefWindowProc (hwnd, message, wParam, lParam);319 }320 321 VOID Thread (PVOID pvoid)322 {323 while (TRUE)324 {325 Sleep (1000);326 if (fCurrent) SetThreadExecutionState (ES_CONTINUOUS);327 else SetThreadExecutionState (ES_AWAYMODE_REQUIRED | ES_SYSTEM_REQUIRED | ES_CONTINUOUS);328 }329 }
一个简单的阻止笔记本合上盖子休眠的程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。