Вот документы из Windows SDK. Что касается « Почему», то программы могут адаптировать свою работу. Ctrl + C также является символьным кодом 3, который является управляющим кодом etx - конец текста. Также помните, что CMD
- это обычная консольная программа, например, wmic
или ftp
.
Консольные контроллеры
Каждый консольный процесс имеет свой собственный список функций-обработчиков управления, которые вызываются системой, когда процесс получает сигнал CTRL+C, CTRL+BREAK или CTRL+CLOSE. Первоначально список обработчиков элементов управления для каждого процесса содержит только функцию обработчика по умолчанию, которая вызывает функцию ExitProcess. Консольный процесс может добавлять или удалять дополнительные функции HandlerRoutine, вызывая функцию SetConsoleCtrlHandler. Эта функция не влияет на списки обработчиков управления для других процессов. Когда консольный процесс получает какой-либо из управляющих сигналов, он вызывает функции-обработчики на основе последней зарегистрированной, вызываемой в первую очередь, пока один из обработчиков не вернет TRUE. Если ни один из обработчиков не возвращает TRUE, вызывается обработчик по умолчанию.
Параметр функции dwCtrlType определяет, какой управляющий сигнал был получен, а возвращаемое значение указывает, обрабатывался ли сигнал.
Пример функции обработчика управления см. В разделе «Регистрация функции обработчика управления».
Сигналы CTRL+C и CTRL+BREAK
Комбинации клавиш CTRL+C и CTRL+BREAK получают особую обработку консольными процессами. По умолчанию, когда окно консоли имеет фокус клавиатуры, CTRL+C или CTRL+BREAK обрабатываются как сигнал (SIGINT или SIGBREAK), а не как ввод с клавиатуры. По умолчанию эти сигналы передаются всем процессам консоли, которые подключены к консоли. (Отдельные процессы не затрагиваются.) Система создает новый поток в каждом клиентском процессе для обработки события. Поток вызывает исключение, если процесс отлаживается. Отладчик может обработать исключение или продолжить обработку без обработки.
CTRL+BREAK всегда обрабатывается как сигнал, но приложение может изменить поведение CTRL+C по умолчанию двумя способами, предотвращающими вызов функций-обработчиков:
Функция SetConsoleMode может отключить режим ввода ENABLE_PROCESSED_INPUT для буфера ввода консоли, поэтому CTRL+C сообщается как ввод с клавиатуры, а не как сигнал.
Когда SetConsoleCtrlHandler вызывается со значениями NULL и TRUE для его параметров, вызывающий процесс игнорирует сигналы CTRL+C. Обычная обработка CTRL+C восстанавливается путем вызова SetConsoleCtrlHandler со значениями NULL и FALSE. Этот атрибут игнорирования или не игнорирования сигналов CTRL+C наследуется дочерними процессами, но он может быть включен или отключен любым процессом, не затрагивая существующие процессы.
CTRL+ ЗАКРЫТЬ сигнал
Система генерирует сигнал CTRL+CLOSE, когда пользователь закрывает консоль. Все процессы, подключенные к консоли, получают сигнал, давая возможность каждому процессу очиститься перед завершением. Когда процесс получает этот сигнал, функция-обработчик может выполнить одно из следующих действий после выполнения любых операций очистки:
Вызовите ExitProcess, чтобы завершить процесс.
Вернуть ЛОЖЬ. Если ни одна из зарегистрированных функций-обработчиков не возвращает TRUE, обработчик по умолчанию завершает процесс.
Вернуть ИСТИНА. В этом случае никакие другие функции-обработчики не вызываются, и всплывающее диалоговое окно спрашивает пользователя, следует ли прекратить процесс. Если пользователь решает не завершать процесс, система не закрывает консоль, пока процесс не завершится окончательно.
Отправить комментарии по этой теме в Microsoft
Дата постройки: 02.10.2006