自从接触电脑以来,很多时候都不能做到早睡早起身体好,这两天写了个小软件来管理电脑,到了设置的时间就自动关机,至于能不能起到相应的作用那是后话,这里仅仅谈谈设计思路。
程序初始化的时候首先设置默认关机时间是晚上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 );
}