我的系统运行的平台是WINDOWS2000以上,在我的系统中我想在关闭我的系统的同时关闭计算机,请各位大侠告之,不胜感谢!

解决方案 »

  1.   

    在FORM中加入一BUTTONunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ComboBox1: TComboBox;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        function WinExitInNT(iFlags : integer): boolean;
        function SetPrivilege(sPrivilegeName : string; bEnabled : boolean): boolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}
    //Enabled or DisEnabled the SE_SHUTDOWN_NAME privilege
    //sPrivilegeName:
    // 'SE_SHUTDOWN_NAME'
    //bEnabled :
    // Enabled or DisEnabled 'SE_SHUTDOWN_NAME' privilege
    function TForm1.SetPrivilege(sPrivilegeName : string; bEnabled : boolean): boolean;
    var
      TPPrev, TP : TTokenPrivileges;
      Token : THandle;
      dwRetLen : DWord;
    begin
      Result := False;
    //opens the access token associated with a process.
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);              //handle to process
     //Required to change the privileges specified in an access token.
    //Required to query the contents of an access token.
    TP.PrivilegeCount := 1;
    //retrieves the locally unique identifier (LUID) used on a specified system to
    //locally represent the specified privilege name.
    if LookupPrivilegeValue(Nil, PChar(sPrivilegeName), TP.Privileges[0].LUID) then
    //attempts to find the privilege name on the local system.
    // address of string specifying the privilege
    // address of locally unique identifier
    begin
      if(bEnabled)then //Give this privileges
      begin
      TP.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
      end
      else begin //NOT Give this privileges
        TP.Privileges[ 0 ].Attributes := 0;
      end;
      dwRetLen := 0;
    //enables or disables privileges in the specified access token.
      Result := AdjustTokenPrivileges(Token, False, TP, Sizeof(TpPrev), TPPrev, dwRetLen);
    // handle to token that contains privileges
    //False
    //modifies privileges
    //TP
    // pointer to new privilege information
    //SizeOf( TPPrev )
    // size
    //in bytes
    //of the TPPrev buffer
    //TPPrev
    // receives original state of changed privileges
    //dwRetLen // receives required size of the TPPrev buffer
      end;
      CloseHandle( Token );
    end;{
    NT中的关闭计算机,重新登陆的实现
    在NT中要实现以上的功能,首先必须获得SE_SHUTDOWN_NAME权限后,才能调用ExitWindowsEx;这是和Windows95的不同
    //iFlags:
    // one of the following must be specified
    // EWX_LOGOFF
    // EWX_REBOOT
    // EWX_SHUTDOWN
    // following attributes may be combined with above flags
    // EWX_POWEROFF
    // EWX_FORCE : terminate processes
    }
    function TForm1.WinExitInNT(iFlags : integer): boolean;
    begin
      Result := True;
      if( SetPrivilege( 'SeShutdownPrivilege',True ) )then
      begin
        if( not ExitWindowsEx( iFlags,0 ) )then
        begin
          Result := False;
        end;
        SetPrivilege( 'SeShutdownPrivilege',False );
      end
      else
      begin
      // handle errors...
        Result := False;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if WinExitInNt(ComboBox1.ItemIndex) then Close;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.ItemIndex := 0;
    end;end.
      

  2.   

    ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0)
      

  3.   

    bluebilly说得很对, 在2000下可以做到,谢谢!
    siyu2002那种方法可能在9X下能用,具体我没有测过都有谢谢参与!
    马上给分!