第4章 系统控制编程实例

实例65 重启动和关闭计算机

    

本实例介绍在Windows 2000环境下如何注销、重新启动和关闭计算机。

向窗体上添加一个TButton组件和3TRadioButton组件,其中TRadioButton组件用于选择程序的功能是注销、重新启动还是关闭计算机。设计完成的主界面如图4-9所示。

4-9  主界面

Windows 2000操作系统中,如果在程序中直接调用ExitWindowsEx函数来完成重新启动计算机等系统级操作时,需要提升应用程序的操作权限,在本实例中,通过窗体的初始化过程来完成这一步骤:

procedure TForm1.FormCreate(Sender: TObject);

var

  hToken : THandle;

  Tkp : TTokenPrivileges;

  Zero: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,SizeOf(TTokenPrivileges),nil,Zero);

end;

执行以上代码,应用程序就可以获得注销、重新启动或关闭计算机的权限。

如果用户选择了程序需要完成的功能,单击“确定”按钮就可以完成用户指定的功能,响应代码如下:

procedure TForm1.btnOKClick(Sender: TObject);

begin

    if self.RadioButton1.Checked then

    begin

        ExitWindowsEx(EWX_LOGOFF,0);

    end;

    if self.RadioButton2.Checked then

    begin

        ExitWindowsEx(EWX_REBOOT,0);

    end;

    if self.RadioButton3.Checked then

    begin

        ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0);

    end;

end;

程序通过判断3TRadioButton组件的选中状态来设置ExitWindowsEx函数的第1个参数,如果该参数的第1个参数值为EWX_LOGOFF,那么就会完成注销的操作;如果为EWX_REBOOT,那么就会完成重新启动的操作;如果为EWX_SHUTDOWN or EWX_POWEROFF,那么就会关闭计算机。

程序代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    btnOK: TButton;

    RadioButton1: TRadioButton;

    RadioButton2: TRadioButton;

    RadioButton3: TRadioButton;

    procedure FormCreate(Sender: TObject);

    procedure btnOKClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

implementation

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

var

  hToken : THandle;

  Tkp : TTokenPrivileges;

  Zero: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,SizeOf(TTokenPrivileges),nil,Zero);

end;

 

procedure TForm1.btnOKClick(Sender: TObject);

begin

    if self.RadioButton1.Checked then

    begin

        ExitWindowsEx(EWX_LOGOFF,0);

    end;

    if self.RadioButton2.Checked then

    begin

        ExitWindowsEx(EWX_REBOOT,0);

    end;

    if self.RadioButton3.Checked then

    begin

        ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0);

    end;

end;

 

end.

保存文件,然后按F9键运行程序,程序运行的初始画面如图4-10所示。

4-10  程序运行的初始画面

读者可以通过选择3TRadioButton组件来决定注销、重新启动还是关闭计算机。

读者通过这个实例不但可以学习到如何进行关闭计算机等系统级操作,也可以学会如何提升应用程序的操作权限,这一点在Windows 2000等操作系统中尤为关键。