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ł: pekfos
Biblioteki C/C++

SetConsoleCtrlHandler

[funkcja] Dodaje lub usuwa procedurę » WinAPIHandlerRoutine dla aktualnego procesu.

Składnia

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

BOOL WINAPI SetConsoleCtrlHandler(
PHANDLER_ROUTINE HandlerRoutine,
BOOL Add
);

Argumenty

ArgumentOpis
HandlerRoutineWskaźnik na zdefiniowaną w aplikacji procedurę HandlerRoutine do dodania lub usunięcia. Ten argument może być ustawiony na NULL.
AddGdy ten argument jest ustawiony na TRUE, procedura jest dodawana, jeśli na FALSE, procedura jest usuwana. Jeśli argument HandlerRoutine jest ustawiony na NULL, TRUE powoduje ignorowanie skrótu Ctrl+C a FALSE przywraca domyślne przetwarzane Ctrl+C. Atrybut określający ignorowanie sygnału Ctrl+C jest dziedziczony przez procesy potomne.

Zwracana wartość

Jeśli funkcja kończy się powodzeniem, zwraca wartość niezerową. W przeciwnym razie, zwrócona wartość jest równa zero. By otrzymać dodatkowe informacje o błędzie, użyj GetLastError().

Opis szczegółowy

Ta funkcja działa podobnie do komunikatu WM_QUERYENDSESSION w aplikacjach okienkowych z pętlą komunikatów. Możesz również używać tej funkcji w programach okienkowych ale jest prawdopodobne, że komunikat WM_QUERYENDSESSION zostanie obsłużony jako pierwszy.
Każdy proces konsolowy ma własną listę z procedurami do obsługi Ctrl+C i Ctrl+Break. Te procedury obsługują także komunikaty generowane przez system gdy użytkownik zamyka konsole lub wyłącza system. Domyślnie, taka lista zawiera tylko procedurę wywołującą funkcję ExitProcess(). Proces dodaje i usuwa procedury wywołując SetConsoleCtrlHandler() co nie ma wpływu na inne procesy. Gdy proces otrzymuje sygnał, procedury są wywoływane wedle schematu "ostatnia zarejestrowana = pierwsza wywołana" dopóki jakaś procedura nie zwróci TRUE. Jeśli żadna nie zwróci TRUE, wywoływana jest domyślna procedura kończąca proces.
W procesach konsolowych kombinacje klawiszy Ctrl+C i Ctrl+Break są traktowane jako sygnały CTRL_C_EVENT i CTRL_BREAK_EVENT. Jeśli aktywne okno konsoli otrzyma Ctrl+C lub Ctrl+Break, sygnał jest przekazywany do wszystkich procesów współdzielących tę konsolę.
Ctrl+Break jest zawsze traktowane jako sygnał ale przeznaczenie Ctrl+C może być zmienione na trzy sposoby:
  • Funkcja SetConsoleMode może wyłączyć tryb ENABLE_PROCESSED_INPUT dla bufora wejścia konsoli by Ctrl+C było traktowane jak zwykłe wejście a nie sygnał.
  • Wywołanie SetConsoleCtrlHandler(NULL, TRUE) sprawia, że proces będzie ignorował sygnał Ctrl+C. Ten atrybut jest dziedziczony przez procesy potomne.
  • Jeśli proces konsolowy jest debugowany, a sygnały Ctrl+C nie są wyłączone, system generuje wyjątek DBG_CONTROL_C. Ten wyjątek jest generowany tylko na rzecz debuggera, więc aplikacja nigdy nie powinna przetwarzać tego wyjątku.
Proces konsolowy może użyć funkcji GenerateConsoleCtrlEvent() by wysłać sygnał Ctrl+C lub Ctrl+Break do grupy procesów konsolowych.
System generuje sygnały CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT gdy użytkownik odpowiednio: zamyka konsole, wylogowuje się lub wyłącza system. Proces ma wtedy możliwość by prawidłowo zakończyć działanie.
Funkcje konsolowe lub funkcje CRT wywołujące funkcje konsolowe mogą nie działać podczas przetwarzania wyżej wymienionych trzech sygnałów. Powodem jest to, że część lub wszystkie wewnętrzne konsolowe procedury sprzątające mogą być wywołane przed obsługą sygnału przez proces.

Wymagania

Minimalny wspierany klientWindows 2000 Professional
Minimalny wspierany serwerWindows 2000 Server
BibliotekaKernel32.lib
DLLKernel32.dll

Linki zewnętrzne