我用了ExitWindowsEx这个函数,可是不行.

解决方案 »

  1.   


    ExitWindowsEx(EWX_LOGOFF , 0);       //注销
    ExitWindowsEx(EWX_SHUTDOWN, 0);      //关机,但是,不关闭电源
    ExitWindowsEx(EWX_REBOOT , 0);       // 重启
    ExitWindowsEx(EWX_FORCE , 0);        //强制关机
    ExitWindowsEx(EWX_POWEROFF, 0);      //关机,并且关闭电源
    ExitWindowsEx(EWX_FORCEIFHUNG , 0);  //这个我自己测试通过的
      private
        { Private declarations }
        procedure AdjustToken; // 在private里面添加然后定义
    procedure TForm1.AdjustToken;
    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;
    最后调用procedure TForm1.Button2Click(Sender: TObject);
    begin
       AdjustToken;
       exitwindowsex(EWX_FORCE + EWX_SHUTDOWN ,0);
    end;
    以上适用于 2k和xp,我都测试过
      

  2.   

    直接调用exitwindowsex函数不行,2K和xp需要取得权限