回 帖 发 新 帖 刷新版面

主题:如何用API关机

如何用C调用API写关机的程序。
高手请指点。
必加分

回复列表 (共6个回复)

沙发

包含windows.h
然后调用ExitWindowsEx

BOOL ExitWindowsEx(
  UINT uFlags,
  DWORD dwReason
);

uFlags的值:
EWX_LOGOFF,0,注销
EWX_SHUTDOWN,1,关机
EWX_REBOOT,2,重启
EWX_POWEROFF,8,断开电源
EWX_FORCE,4,强制终止所有程序
EWX_FORCEIFHUNG,16,强制终止位响应的程序

后面的dwReason一般不指定,具体内容可以去微软的MSDN站上查阅。

返回值为0时表示失败,非0时就表示已经开始执行关机操作。

板凳


谢谢楼上的。

3 楼

上面的朋友 

哪个关机是不性的
因为你没有权限
只能注销

4 楼

var
  hdlProcessHandle : Cardinal;
  hdlTokenHandle   : Cardinal;
  tmpLuid          : Int64;
  tkp              : TOKEN_PRIVILEGES;
  tkpNewButIgnored : TOKEN_PRIVILEGES;
  lBufferNeeded    : Cardinal;
  Privilege        : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
  hdlProcessHandle := GetCurrentProcess;
  OpenProcessToken(hdlProcessHandle,(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),hdlTokenHandle);
  // Get the LUID for shutdown privilege.
  LookupPrivilegevalue('', 'SeShutdownPrivilege', tmpLuid);
  Privilege[0].Luid := tmpLuid;
  Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
  tkp.PrivilegeCount := 1;   // One privilege to set
  tkp.Privileges[0] := Privilege[0];
  // Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges(hdlTokenHandle,False,tkp,Sizeof(tkpNewButIgnored),tkpNewButIgnored,lBufferNeeded);
end;
先进行权限设置,然后调用关机函数

5 楼


哇。这个是PASCAL程序。


我说的是C呀。
够长的这个。

6 楼

MSDN提供的例子

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, 
               SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
               SHTDN_REASON_MINOR_UPDATE |
               SHTDN_REASON_FLAG_PLANNED)) 
      return FALSE; 

   return TRUE;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册