[Delphi]Jak wyłączyć komputer z poziomu delp. Nic nie działa

0

Witam...

Co robię źle?

Potrzebuje kodu który wyłączy komputer po wykonanej akcji. Mam gotowy program i tu problem Kiedy klikam Buttion1 powinien się wyłączyć a nic się nie dzieje. Próbowałem z

ShellExecute(0, 'open', shutdown, 'i', nil, 0);

Jak wpisuje:

procedure TForm1.Button1Click(Sender: TObject);

begin

 ExitWindowsEx(EWX_REBOOT,0);

end;

 i wszystkich mozliwości

EWX_FORCE
	
 
EWX_LOGOFF
	
EWX_POWEROFF
	
EWX_REBOOT
	
EWX_SHUTDOWN
	

I nic się nie dzieje :( Co robię źle o czymś zapomniałem ? Na pewno. Czy ktoś może mi Napisać jak krowie na rowie i po kolei jak wyłączyć komputer jakim poleceniem i czemu to co mam mi nie działa?

Błagam, już nawet bezmyślnie przeklejam kody z google i też nic.
Chodzi o win Xp.

0

Ja w jednym programie rozwiązałem to tak i jak widac dla Windowsa 98 trzeba inaczej,
ale kod ktory jest dla Windowsów NT mi pod Windows XP Home z SP 2 - działa dobrze.
Nie wiem jak będzie pod Windowsami 64 bitowymi, ale może i również wtedy zadziała.

function MyExitWindows(RebootParam: DWord): Boolean;
var
  TTokenHd : THandle;
  TTokenPvg : TTokenPrivileges;
  cbtpPrevious : DWORD;
  rTTokenPvg : TTokenPrivileges;
  pcbtpPreviousRequired : DWORD;
  tpResult : boolean;
const
  SE_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,
      SE_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;

procedure TurnOffComputer;
var
  OS : TOsVersionInfo;
begin
  OS.dwOSVersionInfoSize := SizeOf(os);
  GetVersionEx(os);
  case os.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS:
    begin
      ShellExecute(Application.Handle, 'open',
      'rundll32.exe',  'user,ExitWindows', nil, SW_HIDE);
    end;
    VER_PLATFORM_WIN32_NT:
    begin
      MyExitWindows(EWX_POWEROFF or EWX_FORCE);
    end;
  end;
end;
0

Dziękuje olesio :) Po raz 2 mi pomagasz.
Tylko że mam Form1. Na niej Timer który mierzy czas i wyświetla w label1.
Kiedy w label1 popjawia się odpowiednia wartość otwiera się form2.

I DOKŁADNIE GDZIE MAM WKLEIĆ TEN KOD W JAKIE ZDARZENIE BĄDŹ POD CO? :(

0

Wklejasz w kodzie jakiejś formatki albo osobnego modułu, w sekcji implementation. I to jest definicja. A jak chcesz mieć dostęp
do tych procedur poza jednym modułem to dodajesz wpisy w sekcji interface (dla modułów klas w sekcji public). I to nazywa się
deklaracją. Po prostu procedure TurnOffComputer zadeklaruj i wywołaj ją, w takim momecie, w ktorym będziesz chciał wyłączyć
komputer swój czy Użytkownika. Jeśli ma to być zrobione w jakimś określonym czasie to pewnie po warunku w obsłudze Timera.

0

Albo najprościej - dla opornych - wklejasz to co podał olesio w kodzie programu zaraz po słowie implementation, a do sekcji uses na początku kodu dodajesz słówko shellapi. Jak sobie teraz po naciśnięciu klawisza wpiszesz TurnOffComputer; to wyłączy komputer.

0

No tak, zapomnialem, że może być konieczne uzupełnienie sekcji uses o jakieś moduły, bo
kod wklejałem na szybko, ale po ShellExecute idzie się zorinentować, że potrzeba ShellApi.

0

Dziękuje
Zrozumiałem już wszystko. Jeszcze raz dzięki za cierpliwość w tłumaczeniu mi tego. Wszystko działa tak jak należy. [browar]

OLESIO jestem Ci wdzięczny po raz 3 :)

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