var
Form1: TForm1;
logoff: boolean = false;
reboot: boolean = false;
warn: boolean = false;
downQuick: boolean = false;
cancelShutdown: boolean = false;
powerOff: boolean = false;
timeDelay: integer = 0;
implementation
{$R *.dfm}
function HasParam(Opt: Char): Boolean;
var
x: integer;
begin
result := false;
for x := 1 to paramCount do
if (paramstr(x) = '-'+opt) or (paramstr(x) = '/'+opt) then result := true;
end;
function GetErrorString: String;
var
lz: Cardinal;
err: array[0..512] of Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
result := string(err);
end;
procedure Tform1.DoShutdown ;
var
rl,flgs: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
flgs := 0;
if downQuick then flgs := flgs or EWX_FORCE;
if not reboot then flgs := flgs or EWX_SHUTDOWN;
if reboot then flgs := flgs or EWX_REBOOT;
if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;
if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or EWX_LOGOFF;
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
label2.Caption :='正在关机...'
else begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
if GetLastError <> ERROR_SUCCESS then
label2.Caption :='正在关机...';
end else label2.Caption :='正在关机...';
end;
if CancelShutdown then
if AbortSystemShutdown(nil) = False then
label2.Caption :='正在关机...'
else
label2.Caption :='正在关机...'
else begin
if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then
label2.Caption :='正在关机...'
else
label2.Caption :='正在关机...';
end;
end
else begin
ExitWindowsEx(flgs, 0);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Application.Messagebox(PChar('你确认要关闭计算机吗?'),Pchar('请确认'),MB_YesNO) = IDYES then
begin
downQuick := true;
DoShutdown;
end;
end;