]>Обработчики управляющих сигналов консоли

Обработчики управляющих сигналов консоли

Аватар пользователя mabu

Каждый консольный процесс имеет свой собственный список функций, которые обрабатывают сигналы Ctrl+Break и Ctrl+C. Эти функции также обрабатывают сигналы, созданные системой, когда пользователь закрывает консоль, заканчивает работу в сети или завершает систему. Вначале список обработчиков для каждого процесса содержит только заданную по умолчанию функцию, которая вызывает функцию ExitProcess.

  1. Функция SetConsoleCtrlHandler
  2. Пользовательская функция‐обработчик
  3. Пример

Функция SetConsoleCtrlHandler

Добавляет или удаляет пользовательскую функцию в список обработчиков.

Когда консольный процесс получает какой‐либо из управляющих сигналов, его функции обработчиков особых ситуаций обращаются к последнему из зарегистрированных до тех пор, пока один из обработчиков не возвратит значение TRUE. Если ни один из обработчиков не возвращает TRUE, вызывается заданный по умолчанию обработчик.

Вот определение функции SetConsoleCtrlHandler из заголовочных файлов:

Код FreeBASIC
Declare Function SetConsoleCtrlHandler(ByVal HandlerRoutine As PHANDLER_ROUTINE, ByVal Add As WINBOOL)As WINBOOL

Параметры

HandlerRoutine
Указатель на пользовательскую функцию, которая будет вызываться в качестве обработчика. Эта функция должна принимать один параметр типа DWORD и возвращать значение типа WINBOOL.
Add
Значению флага Add, равному TRUE, соответствует добавление процедуры обработчика, в противном случае происходит удаление процедуры из списка процедур обработки управляющих сигналов консоли.

С одним сигналом могут быть ассоциированы несколько обработчиков, причём обработчики можно добавлять и удалять.

Пользовательская функция‐обработчик

Пользовательская функция должна принимать один параметр типа DWORD и возвращать значение типа WinBool, например, так:

Код FreeBASIC
Declare Function HandlerRoutine(ByVal dwCtrlType As DWORD)As WinBool

Имя функции может быть любым. Эту функцию вызывает операционная система и передаёт параметром dwCtrlType тип события. dwCtrlType может принимать значения:

CTRL_C_EVENT
Происходит при нажатии пользователем Ctrl+C.
CTRL_BREAK_EVENT
Происходит при нажатии пользователем Ctrl+Break.
CTRL_CLOSE_EVENT
Происходит при закрытии консоли по крестику вверху справа. Если функция‐обработчик вернёт значение TRUE, это заставит систему показать диалоговое окно, которое дает пользователю выбор завершения процесса и закрытия консоли или разрешения процесса, чтобы продолжить выполнение.
CTRL_LOGOFF_EVENT
Происходит при выходе пользователя из системы.
CTRL_SHUTDOWN_EVENT
Происходит при выключении системы.

Если функция обрабатывает управляющий сигнал, она должна возвратить TRUE. Если она возвращает значение FALSE, используется следующая функция обработчика в списке обработчиков для этого процесса.

Пример

Код FreeBASIC
#define unicode
#include once "windows.bi"

Function HandlerRoutine(ByVal dwCtrlType As DWORD)As WinBool
&t;Select Case dwCtrlType
&t;&t;Case CTRL_C_EVENT
&t;&t;&t;Print "Нажали Ctrl+C"
&t;&t;Case CTRL_BREAK_EVENT
&t;&t;&t;Print "Нажали Ctrl+Break"
&t;&t;Case CTRL_CLOSE_EVENT
&t;&t;&t;Print "Закрытие по крестику вверху справа"
&t;&t;Case CTRL_LOGOFF_EVENT
&t;&t;&t;Print "Выход пользователя"
&t;&t;Case CTRL_SHUTDOWN_EVENT
&t;&t;&t;Print "Выключение компьютера"
&t;End Select

&t;Return False
End Function


' Установка обработчика
If SetConsoleCtrlHandler(@HandlerRoutine, True) = 0 Then
&t;' Ошибка, выходим
&t;Print "Ошибка"
&t;End(1)
End If

' Задержка
Do
&t;Sleep(1000)
Loop

Поделись ссылочкой в социальных сетях