Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: xevuel
Biblioteki C/C++

ExitWindowsEx

[funkcja] Wyłącza komputer lub wylogowuje użytkownika.

Składnia

C/C++
#include <windows.h>

WINUSERAPI BOOL WINAPI ExitWindowsEx(
UINT uFlags,
DWORD dwReason
);

Argumenty

ArgumentZnaczenie
uFlagsTyp wyłączenia.

W tym argumencie musi być zawarta jedna z podanych wartości:

  • EWX_LOGOFF (0)

    Zakańcza wszystkie aktywne procesy, a następnie wylogowuje użytkownika. Ta flaga może być użyta tylko dla procesów działających w interaktywnej sesji użytkownika.

  • EWX_POWEROFF (0x00000008)

    Zamyka system i wyłącza zasilanie. System musi obsługiwać taką funkcjonalność. Proces wywołujący musi posiadać przywilej SE_SHUTDOWN_NAME.

  • EWX_REBOOT (0x00000002)

    Restartuje system. Proces wywołujący musi posiadać przywilej SE_SHUTDOWN_NAME.

  • EWX_RESTARTAPPS (0x00000040)

    Zamyka system, a następnie restartuje go, jak również wszystkie aplikacje, które zostały zarejestrowane do restartu za pomocą funkcji RegisterApplicationRestart. Te programy otrzymają komunikat WM_QUERYENDSESSION z argumentem lParam ustawionym na ENDSESSION_CLOSEAPP.

  • EWX_SHUTDOWN (0x00000001)

    Zamyka system. Wszystkie bufory plików zostaną opróżnione, a wszystkie procesy zostaną zatrzymane. Użycie tej flagi nie spowoduje wyłączenia zasilania, nawet jeśli system obsługuje taką funkcjonalność. Musisz użyć flagi EWX_POWEROFF, aby to zrobić. Proces wywołujący musi posiadać przywilej SE_SHUTDOWN_NAME.

    Windows XP z dodatkiem SP1:
    Użycie tej flagi spowoduje wyłączenie zasilania, o ile system obsługuje taką funkcję.

Może on również zawierać jedną z poniższych flag:

  • EWX_FORCE (0x00000004)
    Flaga nie daje żadnego efektu, jeśli są włączone usługi terminalowe. W przeciwnym wypadku, system nie wyśle komunikatu WM_QUERYENDSESSION, co może spowodować utratę danych przez aplikacje. Dlatego należy stosować tą flagę tylko w sytuacjach awaryjnych.

  • EWX_FORCEIFHUNG (0x00000010)
    Wymusza zakończenie działania procesów, jeśli nie odpowiedzą na komunikaty WM_QUERYENDSESSION lub WM_ENDSESSION w określonym czasie.

dwReasonPowód wyłączenia systemu.

Windows 2000:
Ten argument jest ignorowany.

Zwracana wartość

Jeśli wywołanie funkcji się powiedzie, zwraca ona wartość niezerową. W przeciwnym wypadku zwraca 0. Aby uzyskać szczegółowe informacje o błędzie, użyj funkcji » WinAPIGetLastError.

Opis szczegółowy

Użycie funkcji ExitWindowsEx wymaga uzyskania specjalnego przywileju. Oto jak go uzyskać:
C/C++
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
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, NULL, 0 );
if( GetLastError() != ERROR_SUCCESS )
{
    //Nie uzyskano przywileju
}
else
{
    //Uzyskano przywilej
}
Po czym można już swobodnie korzystać z ExitWindowsEx. W naszym przykładzie zrestartujemy komputer:
C/C++
ExitWindowsEx( EWX_REBOOT, 0 );

Wymagania

Minimalny obsługiwany klientWindows 2000 Professional
Minimalny obsługiwany serwerWindows 2000 Server
NagłówekWinuser.h (wewnątrz Windows.h)
BibliotekaUser32.lib
DLLUser32.dll

Linki zewnętrzne