操作注册表,关闭计算机

写了个定时关机的小程序,到点关机,早睡早起。



#include<Windows.h>


BOOL MySystemShutdown()
{
	HANDLE hToken; 
	TOKEN_PRIVILEGES tkp; 

	// Get a token for this process. 

	if (!OpenProcessToken(GetCurrentProcess(), 
		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
		return( FALSE ); 

	// Get the LUID for the shutdown privilege. 

	LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
		&tkp.Privileges[0].Luid); 

	tkp.PrivilegeCount = 1;  // one privilege to set    
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

	// Get the shutdown privilege for this process. 

	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
		(PTOKEN_PRIVILEGES)NULL, 0); 

	if (GetLastError() != ERROR_SUCCESS) 
		return FALSE; 

	// Shut down the system and force all applications to close. 

	if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 
		SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
		SHTDN_REASON_MINOR_UPGRADE |
		SHTDN_REASON_FLAG_PLANNED)) 
		return FALSE; 

	return TRUE;
}


BOOL MyRegeditRun()
{
	//写入注册表,开机自启动   
	HKEY hKey;   
	//找到系统的启动项   
	LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";   
	LPCTSTR lpValue = "shutdown";
	//打开启动项Key   
	long lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_ALL_ACCESS, &hKey);   
	if(lRet == ERROR_SUCCESS)   
	{   
		char buff[MAX_PATH];
		DWORD dwType = REG_SZ;
		DWORD dwSize = MAX_PATH;
 

		lRet = RegQueryValueExA(hKey, lpValue, 0, &dwType, (LPBYTE)buff, &dwSize);

		char filePath[MAX_PATH];
		DWORD dwRet = GetModuleFileName(NULL, filePath, MAX_PATH);   
		if (lRet == ERROR_SUCCESS)
		{
			if (!strcmp(buff, filePath))
			{
				//has key and value
				RegCloseKey(hKey);
				return TRUE;
			}
		}

		//don't has key, set value
		lRet = RegSetValueExA(hKey, lpValue, 0, REG_SZ, (BYTE *)filePath, dwRet);  
		if(lRet == ERROR_SUCCESS)
		{
			RegCloseKey(hKey);
			return TRUE;
		}
		RegCloseKey(hKey);
	}
	return FALSE;
}


LONG SleepTime(UINT hour, UINT minute)
{
	SYSTEMTIME time;
	GetLocalTime(&time);
	return (hour - time.wHour) * 3600 + (minute - time.wMinute) * 60;
}


void ReadTimeIni(int& hour, int& minute, bool isWrite = false)
{
	wchar_t strPath[MAX_PATH];
	wchar_t* strApp = L"Time";
	::GetCurrentDirectoryW(MAX_PATH, strPath);
	wcscat_s(strPath, MAX_PATH, L"\\time.ini");
	if (isWrite)
	{
		::WritePrivateProfileStringW(strApp, L"hour", L"0", strPath);
		::WritePrivateProfileStringW(strApp, L"minute", L"0", strPath);
	}
	else
	{
		hour = ::GetPrivateProfileIntW(strApp, L"hour", 0, strPath);
		minute = ::GetPrivateProfileIntW(strApp, L"minute", 0, strPath);
	}
	
}


int WINAPI WinMain(  
				   HINSTANCE hInstance,       // handle to current instance  
				   HINSTANCE hPrevInstance,      // handle to previous instance  
				   LPSTR lpCmdLine,           // command line  
				   int nCmdShow                    // show state  
				   ) 
{
	if(MyRegeditRun())
	{
		SYSTEMTIME time;
		GetLocalTime(&time);
		int hour, minute;
		ReadTimeIni(hour, minute);
		long second = SleepTime(hour, minute);
		if (second >= 0)
		{
			::Sleep(second * 1000);
			if(!MySystemShutdown())
				::MessageBox(NULL, "Shutdown Fail", "Error", MB_ICONERROR);
		}
	}
	else
	{
		::MessageBox(NULL, "Regedit Run Error", "Error", MB_ICONERROR);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值