czy da sie programowo wylaczyc komputer ? znalazlem kod pod 9x ale pod Xp nie ma :(
chodzi mi o to zeby moc ZRESETOWAC, WYLACZYC, i WYLOGOWAC kiedy sie chce system XP
dziekuje
pozdrawiam
wylogowanie xp: Win32Check(ExitWindows(0, 0));
a codo reszty dzial kody zrodlowe tam masz chyba 2 programy ktore demonstruja zamykanie xp
W jakimś FAQ to widziałem...
Spróbuje Ci przesłać ten FAQ :)
Wyłączenie komputera:
function ExitWindows2: boolean;
var
vi: TOSVersionInfo;
hToken: THandle;
tp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
Result := False;
FillChar(tp, SizeOf(tp), 0);
vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(vi);
if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then
Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0)
else
if OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp),
tp, ReturnLength) then
Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
end;
end;
Restart komputera:
function RestartWindows: boolean;
var
vi: TOSVersionInfo;
hToken: THandle;
tp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
Result := False;
FillChar(tp, SizeOf(tp), 0);
vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(vi);
if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then
Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0)
else
if OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege',
tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp),
tp, ReturnLength) then
Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
end;
end;
Kompletnie nie rozumiem... Zapuszczam tą twoją funkcję, i jedyne co się dzieje, to samoczynne i niezapowiedziane nagłe wyłączenie wszystkich programów... Próbowałem ściągnąć program o nazwie 'XP Closer' i rzeczywiście, działa. Jednak gdy próbuję przenosić z niego procedury, to otrzymuję ten sam efekt, co w przypadku pokazanej przez ciebie metody.
Dodam tylko, że posiadam WinZgrozę opatrzoną numerkiem 98 i dodatkiem SE na końcu nazwy :D.
PS. Bardzo proszę o info o nawiązaniu dyskusji na GG (5118732), bo z niewiadomych przyczyn nie mogę się zalogować w serwisie i tym samym ustawić funkcji powiadamiania e-mail o nowych wiadomościach.
jest pewna różnica pomiędzy wyłączniem XP a 98 i pewnie dlatego ta funkcja nie działa poprawnie, btw był z tego co pamietam taki topic i były tam odpowiedzi jak to zrobić pod każdą winde chyba
Dzięki, ale zawodny okazał się nie kod, ale moja głupota ;). Jeżeli włączam program 'pod kontrolą' Delphi (tzn. klikając przycisk Run) nic nie działa, ale jeżeli zwyczajnie włączę exec, wystarczy nawet samo polecenie
ExitWindowsEx(EWX_REBOOT or EWX_FORCE,0);
</delphi>
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);