版权声明:本文为博主原创文章,禁止转载。 https://blog.csdn.net/FlushHip/article/details/84633322
这纯属记录下代码,Windows系统在程序中关机和重启电脑。
大体上就是两个步骤:
- 拿关机权限
- 关机
需要注意的点,一定要在ExitWindowsEx
中加上EWX_FORCE
参数,不然,在Windows锁屏界面下是关不了机或者重启不了的。
static inline BOOL ChangePrivilege(const TCHAR * PName, BOOL bEnable)
{
BOOL result = TRUE;
HANDLE token;
TOKEN_PRIVILEGES tokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &token))
{
result = FALSE;
return result;
}
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
if (!LookupPrivilegeValue(NULL, PName, &tokenPrivileges.Privileges[0].Luid))
{
result = FALSE;
CloseHandle(token);
return result;
}
AdjustTokenPrivileges(token, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
result = FALSE;
}
CloseHandle(token);
return result;
}
void ShutdownPc()
{
ChangePrivilege(SE_SHUTDOWN_NAME, TRUE);
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
ChangePrivilege(SE_SHUTDOWN_NAME, FALSE);
}
void RebootPc()
{
ChangePrivilege(SE_SHUTDOWN_NAME, TRUE);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
ChangePrivilege(SE_SHUTDOWN_NAME, FALSE);
}