在win2000的环境下运行后,可以出现“可以安全的关闭计算机了”的画面,
却无法关闭机箱电源。为什么不能像os里关机一样,同时关闭机箱电源呢?procedure TForm1.Shutdown();
var
  rl: Cardinal;
  hToken: Cardinal;
  tkp: TOKEN_PRIVILEGES;
begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
      if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
      begin
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        tkp.PrivilegeCount := 1;
        AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
      end;
      ExitWindowsEx(EWX_SHUTDOWN,0);
end;

解决方案 »

  1.   

    原因是:
    EWX_SHUTDOWN 参数只是使WINDOWS关闭所有的程序,使系统处在可关机状态。
    应该使用:EWX_POWEROFF 参数,这样,在ATX的机器上可以直接的关闭电源!即,将最后一句改为:
    ExitWindowsEx(EWX_POWEROFF,0);
      

  2.   

    win2k下不能用exitwindowsex来关机
    procedure shutdown(ReBoot:Boolean);
    const
    ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
    SHTDWN_PRIV = ‘SeShutdownPrivilege‘;
    PRIV_SIZE = SizeOf(TTokenPrivileges);
    var
    Len: DWORD;
    TokenPriv, Dummy: TTokenPrivileges;
    Token: THandle;
    begin
    OpenProcessToken(GetCurrentProcess, ADJUST_PRIV, Token);
    LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid);
    TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    TokenPriv.PrivilegeCount := 1; 
    AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len);
    InitiateSystemShutDown(nil,nil,0,True,Reboot);
    end;
      

  3.   

    呵,前天刚帮朋友做过一个,不过是从<超级猛料>上改的...program WinClose;uses
      Forms, System, Windows;{$R *.res}var
      hProcess,hAccessToken:THandle;
      BufferIsNull:DWORD;
      LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';begin
      Application.Initialize;
      Application.Run;
      hProcess:=GetCurrentProcess();
      OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
      LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
      LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
      TOKEN_PRIVILEGES.PrivilegeCount:=1;
      TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
      BufferIsNull:=0;
      AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVILEGES),Nil,BufferIsNull);
      ExitWindowsEx(EWX_POWEROFF, 0);
    end.必然好用,只是功能简单了...