Qt 编写的应用程序,需要调用Windows API,对系统进行重启 和 关机,代码来源网上,稍作修改,笔记以为方便。
头文件
当然需要加入
#include <windows.h>
关闭系统
bool MainWindow::ShutDownWindows() { HANDLE hToken; TOKEN_PRIVILEGES tkp; //获取进程标志 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; //获取关机特权的LUID LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //获取这个进程的关机特权 AdjustTokenPrivileges(hToken, false, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return false; // 强制关闭计算机 if ( !ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) return false; return true; }
重启系统
bool MainWindow::RestartWindows() { HANDLE hToken; TOKEN_PRIVILEGES tkp; //获取进程标志 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; //获取关机特权的LUID LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //获取这个进程的关机特权 AdjustTokenPrivileges(hToken, false, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS) return false; // 重启 if ( !ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED)) return false; return true; }
以上代码在 Qt 5.3.2 和 Win7 64b上验证通过。