操作注册表,关闭计算机

来源:互联网 发布:对编程的认识与看法 编辑:程序博客网 时间:2024/06/03 04:16

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



#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 valueRegCloseKey(hKey);return TRUE;}}//don't has key, set valuelRet = 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;}


原创粉丝点击