MOJA PASJA - PROGRAMOWANIE
   Dzisiaj jest Czwartek, 25 maja, 2017r. Ostatnia aktualzacja miała miejsce: 10 grudnia 2006r. Homepage

Programowanie: Artykuły * FAQ * Download * Komponenty * Książki WWW: Artykuły * Narzędzia * Kursy * Darmowe * FAQ * Skrypty * Ksiązki Off-Topic: Aforyzmy * Humor Inne: Forum * Wiki * Liczniki * Linki * Chat * Grafika * Video * Inne



Jak programowo wyłączyć (lub zrestartować) komputer ?
   Ogólnie rzecz biorąc, do wyłączania/restartu kompa służy funkcja ExitWindowsEx. Można równiez użyć funkcji ExitWindows, ale ta jest moim skromnym zdaniem, bardziej zaawansowana oraz wygodniejsza. Jej deklaracja wygląda mniej więcej tak:

BOOL ExitWindowsEx(

  UINT uFlags, // shutdown operation
  DWORD dwReserved // reserved
 );


   Pierwszy parametr - uFlags określa sposób zamknięcia systemu. Możliwe wartości to:

EWX_FORCE - "Twarde" zamknięcie systemu. Do aplikacji nie są wysyłane komunikaty WM_QUERYENDSESSION i WM_ENDSESSION, a zatem wszystkie dane z aplikacji zostają utracone. Należy stosować tylko w wyjątkowych systuacjach.
EWX_LOGOFF - Kończy wszystkie uruchomione procesy, po czym wologowuje aktualnie zalogowanego userka.
EWX_POWEROFF - Zamyka system i wyłącza kompa (oczywiście tylko jeżeli jest ATX).
EWX_REBOOT - Zamyka system, a następnie restartuje kompa.
EWX_SHUTDOWN - Zamyka system, ale tylko do momemntu "Teraz możesz bezpiecznie wyłączyć komputer", czyli że go nie wyłącza



   Jeszcze jedna bardzo ważna uwaga dla użytkowników Windows NT i innych zbudowanych na jego bazie (2000, XP). W systemach tych nie da się zamknąć ani zrestartować tą funkcją systemu. Aby tego dokonać, aplikacja musi mieć jakieś specjalne prawa. Nic dokładniej o tym nie wiem, nie wiem także jak to obejść. Jeżeli ktoś z Was wie, to baardzo proszę o kontakt.


Tekst dodany


   Eureka. Po krótkim poszukiwaniu na grupach dyskusyjnych odnalazłem odpowiedniego posta. Autorem jest Pan Leaf. A oto sendo sprawy, czyli kod który zamyka Windowsy na bazie WinNT.

   Unit1.cpp
  ...
  OSVERSIONINFO vi;
  vi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
  if(GetVersionEx(&vi))
    {
    if(vi.dwPlatformId==VER_PLATFORM_WIN32_NT)
      {
      HANDLE hToken;
      TOKEN_PRIVILEGES tkp;
      if (OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);
        if (GetLastError() != ERROR_SUCCESS)
          {
          CloseHandle(hToken);
          return;
          }
        }
      }
    }
  ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
  ...


   W razie jakichkolwiek pytań czy komplikacji proszę pisać na forum, lub jeżeli wolicie do mnie na e-mail który znajdziecie w dziale kontakt.





Stronę przygotował: Kacper Cieśla (comboy). Wszelkie prawa zastrzeżone.
Reklama * Zgłoś błąd * Kontakt * Hosting * O stronie * Sponsoring
Czas generowania strony: 0.001s