自從接觸電腦以來,很多時候都不能做到早睡早起身體好,這兩天寫了個小軟體來管理電腦,到了設定的時間就自動關機,至於能不能起到相應的作用那是後話,這裡僅僅談談設計思路。
程式初始化的時候首先設定預設關機時間是晚上10點到淩晨6點半,接著從註冊表讀取關機時間,並將自己設為開機自啟動,然後建立視窗,風格為WS_EX_LAYERED和 WS_EX_TOOLWINDOW,並調用SetLayeredWindowAttributes設定黑色為透明色,接著隱藏視窗,到了關機時間,顯示視窗,並繪製倒計時提示文字,倒計時結束後就關機。
程式DEMO:點擊下載
設定視窗為透明背景
SetWindowLong( hWnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TOOLWINDOW );SetLayeredWindowAttributes( hWnd, RGB( 0, 0, 0 ), 0, LWA_COLORKEY );
封裝的註冊表操作介面:
BOOL ReadRegValue( HKEY hRootKey, TCHAR* tszSubKey, TCHAR* tszValueName, DWORD dwKeyType, BYTE* byData, DWORD dwDataSize ){HKEY hKey = NULL;BOOL bResult = FALSE;do {REGSAM sam = KEY_ALL_ACCESS;if ( ERROR_SUCCESS != RegOpenKeyEx( hRootKey, tszSubKey, 0, sam, &hKey )){break;}DWORD dwType = dwKeyType;DWORD dwSize = dwDataSize;if ( ERROR_SUCCESS != RegQueryValueEx( hKey, tszValueName, 0, &dwType, byData, &dwSize )){break;}bResult = TRUE;} while ( 0 );if ( hKey ){RegCloseKey( hKey );hKey = NULL;}return bResult;}BOOL WriteRegValue( HKEY hRootKey, TCHAR* tszSubKey, TCHAR* tszValueName, DWORD dwKeyType, BYTE* byData, DWORD dwDataSize ){BOOL bResult = FALSE;HKEY hKey = NULL;do {DWORD dwResult = 0;REGSAM sam = KEY_ALL_ACCESS;if ( ERROR_SUCCESS != RegCreateKeyEx( hRootKey, tszSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, sam, NULL, &hKey, &dwResult )){break;}if ( ERROR_SUCCESS != RegSetValueEx( hKey, tszValueName, 0, dwKeyType, byData, dwDataSize )){break;;}RegFlushKey( hKey );bResult = TRUE;} while ( 0 );if ( hKey ){RegCloseKey( hKey );hKey = NULL;}return bResult;}
封裝的關機介面:
void ShutdownWindows(){HANDLE hToken = NULL;BOOL bResult = FALSE;do {if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken )){break;}TOKEN_PRIVILEGES token_priv;token_priv.PrivilegeCount = 1;if ( !LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &token_priv.Privileges[0].Luid )){break;}token_priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;token_priv.PrivilegeCount = 1;if ( !AdjustTokenPrivileges( hToken, FALSE, &token_priv, 0, NULL, NULL )){break;}bResult = TRUE;} while ( 0 );ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE | EWX_FORCEIFHUNG, SHTDN_REASON_MAJOR_APPLICATION );}