定时关机的实现

    自从接触电脑以来,很多时候都不能做到早睡早起身体好,这两天写了个小软件来管理电脑,到了设置的时间就自动关机,至于能不能起到相应的作用那是后话,这里仅仅谈谈设计思路。

    程序初始化的时候首先设置默认关机时间是晚上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 );
}



 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值