zamykanie systemu (przykłady nie działają)

0
try
Win32Check(ExitWindowsEx(EWX_SHUTDOWN, 0));
except
WinExec('shutdown.exe -s -f -t 0', SW_HIDE);
end;

skoro to nie działa to jak mam zamykać system??

0
procedure TForm1.Button1Click(Sender: TObject);
begin
ExitWindowsEx(funkcja,0);
end;

Jako funkcje możemy użyć jedną z pięciu dostępnych funkcji:
EWX_FORCE - wyjście bez pytania
EWX_LOGOFF - wylogowanie
EWX_POWEROFF - wyłaczenie komputera
EWX_REBOOT - restat
EWX_SHUTDOWN - stan oszczędności

---
dodatkowo moze przyda tobie się to:
Jak wykryć zamykanie systemu Windows

{nadpisanie procedury przechwytujacej komunikaty}
private
procedure WndProc(var Message: TMessage);override;
end;

var Form1: TForm1;
implementation
procedure TForm1.WndProc(var Message: TMessage);
begin
{identyfikacja komunikatu zamykania Windows}
if Message.Msg = WM_QUERYENDSESSION then
begin
{tu nalezy wprowadzic akcje np. pozwalajaca na 
zamkniecie Windows lub tez nie...}
end;
inherited WndProc(Message);
end;
0

Jeżeli działasz na w2k albo na xp to musisz napisać np. taką funkcję:

function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var
tpPrev, tp: TTokenPrivileges;
token: THandle;
dwRetLen: DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;

i w kodzie piszesz:

SetPrivilege('SeShutdownPrivilege', true);
ExitWindowsEx(EWX_SHUTDOWN,0);
SetPrivilege('SeShutdownPrivilege', false);

Powinno działać. To jest ściągnięte z przykładu, który gdzieś tu jest na 4programmers.

1 użytkowników online, w tym zalogowanych: 0, gości: 1