delphi实现关机,最好有源码。
我的程序要完成两个功能:
1、实施检测数据库中一个表中某一字段的值:
如:实时判断表rcl中字段rcl_flag的值,若等于38,则启动某一程序。
2、某一程序运行结束,自动关机。

解决方案 »

  1.   

    program Start_Reboot;uses 
      Windows,
      Messages,
      ShellAPI,
      Registry,
      sysutils;{$R *.RES}var
      AppInfoReg : TRegistry;
      AppDriver : Byte;
      AppCurrentDir : String;begin
      AppDriver := 0;  
      GetDir(AppDriver , AppCurrentDir);
      AppInfoReg := TRegistry.Create;
      AppInfoReg.RootKey := HKEY_LOCAL_MACHINE;
      try
         AppInfoReg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\', True);
         if not AppInfoReg.ValueExists('Start_Reboot') then AppInfoReg.WriteString('Start_Reboot' , AppCurrentDir + '\Start_Reboot.exe');
         AppInfoReg.CloseKey;
      finally
         AppInfoReg.Free;
      end;              
      ExitWindowsEx(EWX_REBOOT, 0);
    end.
      

  2.   

    以上是一個不斷重新啟動的程序。
    真正有用的是最后的ExitWindowsEx(EWX_REBOOT, 0);
    不過在NT或2000上要注意權限問題。
      

  3.   

    代码如下:
    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.
    checkbox1用来注销   
    checkbox2用来关闭电脑
    checkbox3用来重启电脑
    checkbox5用来退出至于在你的程序中如果做,就由你自己去想啦!
    这样才有进步呀!
      

  4.   


    if rcl_flag=38 then
      winexec('');
    -----------------------
    form.onclose();
    begin
      ExitWindowsEx(EWX_REBOOT, 0);
    end