调用下面的WindowsAPI 可实现
BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);uFlags的取值根据要求而定,比如:EWX_POWEROFF|EWX_FORCE 可强制关闭电源,具体的参数
取值请参照Visual C++的MSDN。
BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);uFlags的取值根据要求而定,比如:EWX_POWEROFF|EWX_FORCE 可强制关闭电源,具体的参数
取值请参照Visual C++的MSDN。
BOOL RebootNT()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp; //SeShutDownPrivilege must be enabled
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return FALSE; //Get a LUID for SeShutdownPrivilege
LookupPrivilegeValue(NULL,TEXT("SeShutdownPrivilege"),
&tkp.Privileges[0].Luid); //PrivilegeCount enables more than one privilege to bo set
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; //应该用下面的代码来确定AdjustTokenPrivileges执行是否成功。
AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0)
if (GetLastError() != ERROR_SUCCESS)
ErrorHandler("权限调整失败."); //exit windows ,and then restart system
ExitWindowsEx(EWX_SHUTDOWN|EWX_REBOOT,0); return TRUE;
}拿去读吧。
//shut down computer
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
if (::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
tp.PrivilegeCount =1;
tp.Privileges[0].Luid=luid;
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
}
::InitiateSystemShutdown(""," The computer will shutdown.",30,FALSE,FALSE);会出现一个对话框,你将有30秒时间决定是否要关机。
//cancel shut down
::AbortSystemShutdown("");