使用windowsAPI关机

转自:https://blog.csdn.net/moreorless/article/details/2147131

ExitWindowsEx

 

The ExitWindowsEx function either logs off the current user, shuts down the system, or shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all applications to determine if they can be terminated.

 
BOOL ExitWindowsEx(
  UINT uFlags,
  DWORD dwReason
);

 

uFlags  [in] Shutdown type. This parameter must include one of the following values.  关机类型EWX_LOGOFFEWX_POWEROFFEWX_REBOOTEWX_SHUTDOWN可选的参数EWX_FORCE       强制进程终止 不发送 WM_QUERYENDSESSION  and  WM_ENDSESSION 消息EWX_FORCEIFHUNG 发送 WM_QUERYENDSESSION  and  WM_ENDSESSION 消息,如果没有响应强制终止进程。 dwReason  [in] Reason for initiating the shutdown. If this parameter is zero, the SHTDN_REASON_FLAG_PLANNED reason code will not be set, and therefore the default action is an undefined shutdown that is logged as "No title for this reason could be found". By default, it is also an unplanned shutdown. Depending on how the system is configured, an unplanned shutdown triggers the creation of a file that contains the system state information, which can delay shutdown. Therefore, do not use zero for this parameter.

示例:

 

The following example enables the SE_SHUTDOWN_NAME privilege and then shuts down the system.

BOOL MySystemShutdown()
{
   HANDLE hToken; 
   TOKEN_PRIVILEGES tkp; 
 
   
// Get a token for this process. 
 
   
if (!OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY, &hToken)) 
      
return( FALSE ); 
 
   
// Get the LUID for the shutdown privilege. 
 
   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
        
&tkp.Privileges[0].Luid); 
 
   tkp.PrivilegeCount 
= 1;  // one privilege to set    
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
 
   
// Get the shutdown privilege for this process. 
 
   AdjustTokenPrivileges(hToken, FALSE, 
&tkp, 0
        (PTOKEN_PRIVILEGES)NULL, 
0); 
 
   
if (GetLastError() != ERROR_SUCCESS) 
      
return FALSE; 
 
   
// Shut down the system and force all applications to close. 
 
   
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) 
      
return FALSE; 

   
return TRUE;
}

 

 注意,如果不实现设置权限 会导致调用失败。

说明:关机功能是通过ExitWindowsEx实现,但是在调用之前需要获取相关权限。

猜你喜欢

转载自blog.csdn.net/qq_16334327/article/details/80774362
今日推荐