function DoExitWindows(RebootParam: Longword): boolean;
var
TTokenHd: THandle;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: boolean;
const
cSE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
tpResult := OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, TTokenHd);
if tpResult then
begin
tpResult := LookupPrivilegeValue(nil, cSE_SHUTDOWN_NAME,
TTokenPvg.Privileges[0].Luid);
TTokenPvg.PrivilegeCount := 1;
TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg);
pcbtpPreviousRequired := 0;
if tpResult then
Windows.AdjustTokenPrivileges(TTokenHd, false, TTokenPvg, cbtpPrevious,
rTTokenPvg, pcbtpPreviousRequired);
end;
end;
Result := ExitWindowsEx(RebootParam, 0);
end;
طریقه فراخوانی:
DoExitWindows(EWX_REBOOT or EWX_FORCE);
Shake Form:
procedure TForm1.Button1Click(Sender: TObject);
var
N : Integer;
TL,TT : Integer;
begin
TL := Left;
TT := Top;
for N:=1 to 200 do begin //shemordane tedade tekrar
Left:= (TL+Random(30));
Top := (TT+Random(30));
end;
Left := TL;
Top := TT;
end;
