本文对windows操作系统关机、重启功能进行规划
.h文件
/* 电源操作类型 */
typedef enum
{
EPowerLogOff = 0, //注销
EPowerReboot, //重启
EPowerShutDown //关机
}PowerControlType;
/**
Description:
提升系统权限函数
@param 无
@return 是否提升权限成功标志
*/
bool EnableShutDownPriv();
/**
Description:
注销重启关机函数
@param flags 0:注销 1:重启 2:关机
@param is_force 是否强制执行系统关机
@return 是否成功执行注销重启关机功能
*/
bool ReSetWindows(int flags, bool is_force);
/**
Description:
开机函数
@param 无
@return 无
*/
void PowerOn();
/**
Description:
关机函数
@param 无
@return 无
*/
void ShutDown();
/**
Description:
重启函数
@param 无
@return 无
*/
void Restart();
.cpp文件
#include <windows.h>
#include <stdint.h>
#include <tlhelp32.h>
#pragma region 注销重启关机函数
/***********************************************************************/
/ 提升系统权限函数 /
/***********************************************************************/
bool PowerController::EnableShutDownPriv()
{
HANDLE token_handle = NULL;
TOKEN_PRIVILEGES token_privileges = { 0 };
/打开当前程序的权限令牌/
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token_handle))
{
return false;
}
/获得某一特定权限的权限标识LUID,保存在tkp中/
if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &token_privileges.Privileges[0].Luid))
{
CloseHandle(token_handle);
return false;
}
token_privileges.PrivilegeCount = 1;
token_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
/调用AdjustTokenPrivileges来提升我们需要的系统权限/
if (!AdjustTokenPrivileges(token_handle, FALSE, &token_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
CloseHandle(token_handle);
return false;
}
return true;
}
/***********************************************************************/
/ 注销重启关机函数 /
/***********************************************************************/
bool PowerController::ReSetWindows(int flags, bool is_force)
{
DWORD flags_param = 0;
switch (flags)
{
case 0:
flags_param = EWX_LOGOFF;
break;
case 1:
flags_param = EWX_REBOOT;
break;
case 2:
flags_param = EWX_SHUTDOWN;
break;
default:
break;
}
/*检查参数是否正确*/
if (flags_param != EWX_LOGOFF && flags_param != EWX_REBOOT && flags_param != EWX_SHUTDOWN)
return false;
/*获得系统的版本信息,让我们后面确定是否需要提升系统权限*/
OSVERSIONINFO osvi = { 0 };
/*获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的
新版本是OSVERSIONINFOEX。扩充版本*/
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&osvi))
{
return false;
}
/*检查操作系统的版本,如果是NT类型的系统,需要提升系统权限*/
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
EnableShutDownPriv();
}
/*判断是否是强制关机,强制关闭系统进程。*/
flags_param |= (is_force != FALSE) ? EWX_FORCE : EWX_FORCEIFHUNG;
//调用API
return ExitWindowsEx(flags_param, 0);
}
#pragma endregion
#pragma region 开机关机重启接口函数
/***********************************************************************/
/ 开机函数 /
/***********************************************************************/
void PowerController::PowerOn()
{
}
/***********************************************************************/
/ 关机函数 /
/*********************************************************************/
void PowerController::ShutDown()
{
/ --------- 将当前系统配置项写入文件保存,再关机 ----------/
GetConfigFileController()->WriteCurrentSystemConfigurationToFile();
ReSetWindows(EPowerShutDown, false);
}
/***********************************************************************/
/ 重启函数 /
/***********************************************************************/
void PowerController::Restart()
{
ReSetWindows(EPowerReboot, false);
}
#pragma endregion