关于c++设置自动关机的 问题

首先需要调用windows API 函数ExitWindowsEx()。

ExitWindowsEX()函数用来退出、重启或注销系统。

  函数原型:

  BOOL ExitWindowsEx(

  UINT uFlags, // 关闭参数

  DWORD dwReserved // 系统保留,一般取0

  );

参数uflags有五种:

EWX_FORCE

  强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会导致应用程序丢失数据。因此,你应该只在紧急情况下使用此标志。

EWX_LOGOFF

  关闭所有进程,然后注销用户。

EWX_POWEROFF

  关闭系统并关闭电源。该系统必须支持断电。

  Windows要求:

  Windows NT中调用进程必须有 SE_SHUTDOWN_NAME 特权。

  Windows 9X中:可以直接调用。

EWX_REBOOT

  关闭系统,然后重新启动系统。

  Windows要求:

  Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。

  Windows 9X中:可以直接调用。

EWX_SHUTDOWN

  关闭系统,安全地关闭电源。所有文件缓冲区已经刷新到磁盘上,所有正在运行的进程已经停止。

  Windows要求:

  Windows NT中:调用进程必须有SE_SHUTDOWN_NAME特权。

  Windows 9X中:可以直接调用。

参数:dwReserved

  保留,这参数被忽略。一般取0。

  返回值

  如果函数成功,返回值为非零。

  如果函数失败,返回值是零。想获得更多错误信息,请调用GetLastError函数。

 

如果想在win7 xp 中调用ExitWindowsEx()进行关机,需要获得SE_SHUTDOWN_NAME特权。

void MyClass::shutDownPC()
{
 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;


 //获取进程标志
 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  return ;


 //获取关机特权的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);

//关闭计算机
 ExitWindowsEx(EWX_SHUTDOWN,0);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值