实现电脑关机、重启功能

本文对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值