Jak w Delphi programowo zamknac WinXP ??? ;-(
Podam Ci kod źródłowy, z poziomu którego, zamkniesz nie tylko XP, ale i starsze wersje systemów Microsoftu.
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;
Teraz, żeby zamknąć system, piszesz:
SetPrivilege('SeShutdownPrivilege', True);
ExitWindowsEx(EWX_POWEROFF or EWX_FORCE,0);
SetPrivilege('SeShutdownPrivilege', False);
W celu ponownego rozruchu:
SetPrivilege('SeShutdownPrivilege', True);
ExitWindowsEx(EWX_REBOOT or EWX_FORCE,0);
SetPrivilege('SeShutdownPrivilege', False);
Wylogowanie sesji użytkownika:
SetPrivilege('SeShutdownPrivilege', True);
ExitWindowsEx(EWX_LOGOFF or EWX_FORCE,0);
SetPrivilege('SeShutdownPrivilege', False);
Wyłączanie komputera z tzw. "fastem, speedem":
SetPrivilege('SeShutdownPrivilege', True);
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE,0);
SetPrivilege('SeShutdownPrivilege', False);
Poszykaj z serwisie programiku XPCloser :) (masz tam tez zrodlo :P
a mozna jakos za pomoca tego "cuda" przelaczyc w stan wstrzymania lub zahibernowac kompa?
Było tu już o hibernowaniu kiedyś. Oto kod jaki znalazłem:
procedure SuspendOrHibernate( ASuspend,AForce : Boolean );
var
iVersionInfo: TOSVersionInfo;
iToken : cardinal;
iPriveleg : TTokenPrivileges;
iaresult : cardinal;
begin
FillChar (iPriveleg, SizeOf (iPriveleg), #0);
iVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(iVersionInfo);
if iVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
Win32Check( OpenProcessToken (GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, iToken) );
Win32Check( LookupPrivilegeValue (nil,'SeShutdownPrivilege',
iPriveleg.Privileges[0].Luid) );
iPriveleg.PrivilegeCount := 1;
iPriveleg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Win32Check(AdjustTokenPrivileges(iToken,False,iPriveleg,
Sizeof(iPriveleg), iPriveleg, iaresult));
end;
Win32Check( SetSystemPowerState( ASuspend, AForce ) );
end;
Użycie :
SuspendOrHibernate(false,false); - hibernuje bez pytania
Udostępnił go AndRew. Nie wiem czy działa :)
Dziękuję [browar]
Może jeszcze tylko zadam jedno pytanie:
Jak programowo sprawdzić czy jest włączona możliwość hibernacji ?
Bo ta procedura powyżej hibernuje komputer, gdy jest włączona ta usługa, ale gdy jest wyłączona, to komputer przechodzi w stan wstrzymania.