请问,如何用 Delphi7 实现定时关机。(1分)

  • 主题发起人 主题发起人 amos_3_1
  • 开始时间 开始时间
A

amos_3_1

Unregistered / Unconfirmed
GUEST, unregistred user!
//使用Windows API函数E x i t Wi n d o w s E x可以关闭Wi n d o w s。函数原型如下:
//BOOL ExitWi n d o w s E x (
//UINT uFlags, // 关闭操作
//DWORD dwReserved // 保留
//) ;
//其中参数u F l a g s的取值及其含义如下:
//. EWX_FORCE 在紧急情况下强制关机。
//. EWX_LOGOFF 以其他用户身份登录。
//. EWX_POWEROFF 关闭系统并关闭电源。
//. EWX_REBOOT 重新启动。
//. EWX_HUTDOWN 安全地关机。
ExitWindowsEx(EWX_LOGOFF, 0);

再加一个定时器就解决了
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,ShellAPI;
//須用到ShellAPI
type
TForm1 = class(TForm)
Timer1: TTimer;
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Started:Boolean;
rectime:TDateTime;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Started:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Started:=True;
rectime:=now; //記錄當前時間
Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF Started=True then
IF now>rectime+StrToDateTime(Edit1.Text) then
ExitWindowsEx(EWX_SHUTDOWN,0);
//ExitWindowsEx請參考Delphi Help中的Windows SDK
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
started:=False;
end;
end.
這個是最簡單最簡單的啦﹐希望能起到拋磚引玉的作用﹐看個人自己發揮啦。
 
win98下面很好办,2000和nt下要多一个步骤。

procedure ShutDown;
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);

//取得关机特权的LUID
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);

if ForceShutdown then //强制关机
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF or EWX_FORCE, $FFFF)
else
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, $FFFF);
end;

至于要定时关机,就很好办了,Message或者Timer控件都可以
 
有什么办法可以避免非法程序的关机?:)
 
后退
顶部