首先定义一函数如下:
function SetPrivilege(PrivilegeName: String; Enable: Boolean): Boolean;
var
NewState, PreviousState: TTokenPrivileges;
token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
NewState.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, PChar(PrivilegeName),NewState.Privileges[0].LUID) then
begin
if Enable then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(token,False, NewState, SizeOf(PreviousState),PreviousState, dwRetLen);
end;
CloseHandle(token);
end;
如果你想实现定时关机,可以加入一定时器,在一Edit或ComboBox中设定时间段(也可以是时刻,但同样可以根据当前时间计算出时间差),例如设定定时器间隔为1000毫秒,TimeSet为经由Edit或ComboBox而得到的关机时间(假设单位为秒),Count为自定义的一整形数据,代表经历的时间,则定时器的触发函数可以定义为:
procedure TFormMain.Timer1Timer(Sender: TObject);
begin
Count := Count + 1;
if Count >= TimeSet then
begin
SetPrivilege('SeShutdownPrivilege', True);
if not ExitWindowsEx((ewx_logoff+ewx_force+EWX_shutdown+ewx_poweroff),0) then
SetPrivilege('SeShutdownPrivilege', False);
close;
end;
end;
如果你经常进行BT下载,想实现下载完成后自动关机(BitCommit好像不支持下载完毕自动关机),可以定义定时器的触发函数为:
procedure TFormMain.Timer1Timer(Sender: TObject);
begin
if FileExists(Trim(EditFileName.Text)) then
begin
DeleteFile(Trim(EditFileName.Text));
SetPrivilege('SeShutdownPrivilege', True);
if not ExitWindowsEx((ewx_logoff+ewx_force+EWX_shutdown+ewx_poweroff),0) then
SetPrivilege('SeShutdownPrivilege', False);
end;
end;
其中EditFileName是你设定的文件名,这里利用了一般BT下载完毕会自动更改文件名这个特点。