怎么在win2000以上关闭计算机呀,我在富翁里找到不少,但都是提示你现在可以安全的关闭的计算机了,没有一个可以自动关的,不知道这里有没有知道的,请贴出源码

解决方案 »

  1.   

    如果你的电脑配置比较新的话就可以用的:),记得给分哦:D
    这里有四个checkbox组件,自己再修改一下吧!
    unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTForm1 = class(TForm)CheckBox1: TCheckBox;CheckBox2: TCheckBox;CheckBox3: TCheckBox;CheckBox4: TCheckBox;CheckBox5: TCheckBox;procedure CheckBox1Click(Sender: TObject);procedure CheckBox2Click(Sender: TObject);procedure CheckBox3Click(Sender: TObject);procedure CheckBox5Click(Sender: TObject);
    privateprocedure wmqueryendsession(var msg:TMessage);message wm_queryendsession;{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}
    procedure TForm1.CheckBox1Click(Sender: TObject);var EWX_LOGOFF,EWX_FORCE:integer;beginEWX_LOGOFF:=0;EWX_FORCE:=4;EXITWINDOWSEX(EWX_FORCE OR EWX_LOGOFF,0);end;
    procedure TForm1.CheckBox2Click(Sender: TObject);var EWX_SHUTDOWN,EWX_FORCE:integer;
        VerInfo: TOSVersionInfo;
        hToken: THANDLE;
        tkp: TOKEN_PRIVILEGES;
        Nothing: Cardinal;begin
    EWX_SHUTDOWN:=1;
    EWX_FORCE:=4;begin
      VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
      GetVersionEx(VerInfo);
        if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
          OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
            hToken);
          LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
          tkp.PrivilegeCount := 1;
          tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
          AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, Nothing);
        end;
        ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 0);
    end;
    EXITWINDOWSEX(EWX_FORCE OR EWX_SHUTDOWN,0);end;
    procedure TForm1.CheckBox3Click(Sender: TObject);var EWX_REBOOT,EWX_FORCE:integer;beginEWX_REBOOT:=2;EWX_FORCE:=4;EXITWINDOWSEX(EWX_FORCE OR EWX_REBOOT,0);end;
    procedure TForm1.wmqueryendsession(var msg: TMessage);beginif checkbox4.checked thenmsg.result:=1elsemsg.result:=0;end;
    procedure TForm1.CheckBox5Click(Sender: TObject);beginclose;end;end.
      

  2.   

    使用WindowsAPI函数呀! 
      关闭计算机:ExitWindowsEx(EWX_SHUTDOWN,0);
      重启计算机:ExitWindowsEx(EWX_REBOOT,0);
      

  3.   

    2000里面是需要得到权限才能关机的,jog81的代码正确
      

  4.   

    Var
      st : SYSTEMTIME;
      hToken : THANDLE;
      tkp : TOKEN_PRIVILEGES;
      rr : Dword;
    Begin
           OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or  TOKEN_QUERY,hToken);
            LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
            // 设定权限为1
            tkp.PrivilegeCount := 1;
            tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
            // 得到权限
            AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,rr);
            // 关闭计算机
             ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 0);
    End;
      

  5.   

    在win2000里是不是必需强制关闭才行?
      

  6.   

    Var
      hToken : THANDLE;
      tkp : TOKEN_PRIVILEGES;
      rr : Dword;
    Begin
           OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or  TOKEN_QUERY,hToken);
            LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
            tkp.PrivilegeCount := 1;
            tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,rr);
            ExitWindowsEx(EWX_SHUTDOWN, 0);
    End;
      

  7.   

    ExitWindowsEx(EWX_LOGOFF , 0);       //注销
    ExitWindowsEx(EWX_SHUTDOWN, 0);      //关机,但是,不关闭电源
    ExitWindowsEx(EWX_REBOOT , 0);       // 重启
    ExitWindowsEx(EWX_FORCE , 0);        //强制关机
    ExitWindowsEx(EWX_POWEROFF, 0);      //关机,并且关闭电源
    ExitWindowsEx(EWX_FORCEIFHUNG , 0);  //
      

  8.   

    用我的函数,在2000下肯定行,经过无数次测试了!function TFrmMain.ShutDownSystem(si:integer):BOOL;
    var
      hProcess,hAccessToken:THandle;
      LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;
      BufferIsNull:DWORD;
    Const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';
    begin
      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);
       case si of
       1:
          ExitWindowsEx(EWX_REBOOT, 0);  //重启
       2:
          ExitWindowsEx(EWX_POWEROFF, 0); //关机
       end;
       ShutDownSystem:=True;
    end;
      

  9.   

    unit main;interfaceuses
      Windows, SysUtils, Classes, Forms, StdCtrls, Mask,
      Buttons, TrayIcon, Menus, Controls, ExtCtrls,Registry;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        MaskEdit1: TMaskEdit;
        BitBtn1: TBitBtn;
        Timer1: TTimer;
        Label2: TLabel;
        BitBtn3: TBitBtn;
        TrayNotifyIcon1: TTrayNotifyIcon;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        procedure BitBtn1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure TrayNotifyIcon1DblClick(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
        procedure AdjustToken();
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      oldx,oldy: integer;
      ShutDownTime:TTime;
      SFlag:Boolean;
    implementationuses About;{$R *.dfm}
    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);
             LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
             Privilege[0].Luid := tmpLuid;
             Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
             tkp.PrivilegeCount := 1;
             tkp.Privileges[0] := Privilege[0];
             AdjustTokenPrivileges(hdlTokenHandle,
                                   False,
                                   tkp,
                                   Sizeof(tkpNewButIgnored),
                                   tkpNewButIgnored,
                                   lBufferNeeded);
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      ZAppName: array[0..127] of char;
      ATitle,TmpStr: String;
      Found: HWND;
      Reg:TRegistry;
    begin
      ATitle := Application.Title;
      Application.Title := 'OnlyOne'
         + IntToStr(HInstance);
      StrPCopy(ZAppName, ATitle);
      Found := FindWindow(nil, ZAppName);
      Application.Title := ATitle;
      if Found<>0 then begin
        Application.Terminate;
      end;
    SFlag:=False;
    Oldx:=Form1.Left;
    Oldy:=Form1.Top;
    Reg:=TRegistry.Create;
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('Software\ShutDownOnTime', False) then
       TmpStr:=Reg.ReadString('TheTime');
    Reg.CloseKey;
    Reg.Free;
    Maskedit1.Text :=TmpStr;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var Reg: TRegistry;
    begin
    if SFlag=False then
    try
           ShutDownTime:=StrtoTime(MaskEdit1.Text+':00');
           Timer1.Enabled :=True;
           BitBtn1.Caption:='取消定时';
           MaskEdit1.Enabled :=False;
           SFlag:=True;
           Reg:=TRegistry.Create;
           Reg.RootKey:=HKEY_LOCAL_MACHINE;
           if Reg.OpenKey('Software\ShutDownOnTime', True) then
              Reg.WriteString('TheTime', MaskEdit1.Text);
           Reg.CloseKey;
           Reg.Free;
    except Application.MessageBox('时间格式不对','错误',MB_OK+MB_ICONERROR);
    end
    Else Begin
           Timer1.Enabled :=False;
           BitBtn1.Caption:='定时关机';
           MaskEdit1.Enabled :=True;
           SFlag:=False;
    end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if Timetostr(time())=TimetoStr(ShutDownTime) then
    Begin
      AdjustToken();
      ExitWindowsEx((EWX_FORCE or EWX_POWEROFF), 0);
    end;
    end;
    procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
    Close;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    TrayNotifyIcon1.IconVisible:=True;
    if SFlag=True then
    TrayNotifyIcon1.Hint:='关机时间:'+Maskedit1.Text
    Else TrayNotifyIcon1.Hint:='没有定时';
    Action:=caNone;
    hide;
    end;procedure TForm1.TrayNotifyIcon1DblClick(Sender: TObject);
    begin
    TrayNotifyIcon1.IconVisible:=False;
    show;
    end;procedure TForm1.N2Click(Sender: TObject);
    begin
    if Application.MessageBox('确实要退出系统吗?','确认',MB_YesNo+MB_ICONQUESTION+MB_DEFBUTTON2)=MrYes then
     Application.Terminate ;
    end;
    procedure TForm1.N3Click(Sender: TObject);
    begin
    AboutBox.ShowModal;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
    Self.Left :=Oldx;
    Self.Top :=OldY;
    end;end.