- •ПРЕРЫВАНИЯ
- •ПРЕРЫВАНИЕ
- •МЕХАНИЗМ ОБРАБОТКИ ПРЕРЫВАНИЙ:
- •ФУНКЦИИ МЕХАНИЗМА ПРЕРЫВАНИЯ:
- •РЕАКЦИЯ НА ПОЯВЛЕНИЕ СИГНАЛА ЗАПРОСА ПРЕРЫВАНИЯ
- •РЕАКЦИЯ НА ПОЯВЛЕНИЕ СИГНАЛА ЗАПРОСА ПРЕРЫВАНИЯ
- •ВРЕМЯ РЕАКЦИИ
- •КЛАССЫ ПРЕРЫВАНИЙ
- •КЛАССЫ ПРЕРЫВАНИЙ
- •ВНЕШНИЕ
- •ТИПЫ ВНЕШНИХ ПРЕРЫВАНИЙ
- •ВНЕШНИЕ
- •АППАРАТНЫЕ (ВНЕШНИЕ) ПРЕРЫВАНИЯ
- •АППАРАТНЫЕ (ВНЕШНИЕ) ПРЕРЫВАНИЯ
- •ПРОГРАММНЫЕ (ВНУТРЕННИЕ) ПРЕРЫВАНИЯ
- •ИСКЛЮЧЕНИЯ (ВНУТРЕННИЕ ПРЕРЫВАНИЯ)
- •АППАРАТНЫЕ И ПРОГРАММНЫЕ СРЕДСТВА СИСТЕМЫ ПРЕРЫВАНИЙ
- •ПРОГРАММНЫЕ СРЕДСТВА СИСТЕМЫ ПРЕРЫВАНИЙ
- •ТАБЛИЦА ВЕКТОРОВ
- •ТАБЛИЦА ВЕКТОРОВ
- •ОБРАБОТКА ПРЕРЫВАНИЙ В ОДНОЗАДАЧНОМ РЕЖИМЕ
- •РАБОТА СИСТЕМЫ ПРЕРЫВАНИЙ В МНОГОЗАДАЧНОМ РЕЖИМЕ
- •КЛАССИФИКАЦИЯ ПРЕРЫВАНИЙ В МНОГОЗАДАЧНОМ (ЗАЩИЩЕННОМ) РЕЖИМЕ
- •СБОЙ (ОШИБКА)
- •АВАРИЙНОЕ
- •ЛОВУШКА (HOOK)
- •ЛОВУШКИ (HOOK)
- •ФУНКЦИЯ ЛОВУШКИ
- •ФУНКЦИЯ ЛОВУШКИ
- •ФУНКЦИЯ ЛОВУШКИ
- •ФУНКЦИЯ ЛОВУШКИ
- •ФУНКЦИЯ ЛОВУШКИ
- •ХУКИ WH_CALLWNDPROC И WH_CALLWNDPROCRET
- •ПАРАМЕТР NCODE МОЖЕТ ПРИНИМАТЬ СЛЕДУЮЩИЕ ЗНАЧЕНИЯ:
- •ХУК WH_DEBUG
- •ХУК WH_FOREGROUNDIDLE
- •ХУК WH_GETMESSAGE
- •ХУК WH_JOURNALPLAYBACK
- •ХУК WH_JOURNALRECORD
- •ХУК WH_KEYBOARD
- •ХУК WH_MOUSE
- •ХУКИ WH_MSGFILTER И WH_SYSMSGFILTER
- •ХУК WH_SHELL
ФУНКЦИЯ ЛОВУШКИ
Функция хука может быть глобальной. В этом случае она просматривает сообщения для всех потоков в системе. Можно также определить функцию хука для одного потока, чтобы просматривать сообщения, предназначенные только этому потоку.
Глобальная функция хука может быть вызвана в контексте любого приложения, поэтому она должна быть помещена в отдельный модуль библиотеки DLL.
Функция хука, определенная для одного потока, вызывается только в контексте данного потока. Если приложение устанавливает функцию хука для одного из своих собственных потоков, она может находиться или в том же модуле, что и остальная часть кода приложения, или в DLL.
Если приложение устанавливает функцию хука для потока другого приложения, ее надо поместить в DLL.
ФУНКЦИЯ ЛОВУШКИ
Использовать глобальные хуки следует только в целях отладки, в противном случае лучше избегать их.
Глобальные хуки снижают эффективность системы и вызывают конфликты с другими приложениями, которые используют такой же тип глобального хука.
ХУКИ WH_CALLWNDPROC И WH_CALLWNDPROCRET
позволяют контролировать сообщения, посланные функциям окна приложений функцией SendMessage(). Windows вызывает функцию хука WH_CALLWNDPROC прежде, чем функция окна получит предназначенное ей сообщение. Функция хука WH_CALLWNDPROCRET вызывается после того, как функция окна получит и обработает сообщение.
Прототип функции хука WH_CALLWNDPROC:
LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam);
Параметр wParam - флаг, который определяет, было ли сообщение отправлено текущим процессом.
Параметр lParam - указатель на структуру CWPSTRUCT, которая содержит информацию о сообщении.
ХУК WH_CBT
Windows вызывает функцию хука WH_CBT в следующих случаях:
•перед активизацией, созданием, разрушением, сворачиванием, разворачиванием, перемещением или изменением размеров окна;
•перед завершением системной команды;
•перед удалением события, связанного с мышью или клавиатурой, из системной очереди сообщений;
•перед установкой фокуса ввода;
•перед синхронизацией посредством системной очереди сообщений.
Значение, которое возвращает функция хука, определяет, будет ли разрешена совершенная операция.
ХУК WH_CBT
Прототип функции хука: |
|
LRESULT CALLBACK CBTProc( int nCode, |
// код хука |
WPARAM wParam,// зависит от кода хука LPARAM lParam // зависит от кода хука);
Если параметр nCode меньше нуля, функция хука просто передает сообщение функции CallNextHookEx() без дальнейшей обработки и возвращает значение, возвращаемое функцией CallNextHookEx().
ПАРАМЕТР NCODE МОЖЕТ ПРИНИМАТЬ СЛЕДУЮЩИЕ ЗНАЧЕНИЯ:
HCBT_ACTIVATE |
Система собирается активизировать окно. |
HCBT_CLICKSKIPPED |
Система удалила сообщение от мыши из системной очереди |
|
сообщений. |
HCBT_CREATEWND |
Система собирается создать окно. Система вызывает функцию |
|
хука перед тем, как послать окну сообщение WM_CREATE или |
|
WM_NCCREATE. Если функция хука возвращает ненулевое |
|
значение, система уничтожает окно; функция CreateWindow() |
|
возвращает NULL, но сообщение WM_DESTROY окну не |
|
посылается. Если функция хука возвращает 0, окно создается в |
|
обычном режиме. |
HCBT_DESTROYWND |
Система собирается уничтожить окно. |
HCBT_KEYSKIPPED |
Система удалила сообщение от клавиатуры из системной |
|
очереди сообщений. |
HCBT_MINMAX |
Система собирается свернуть или развернуть окно. |
HCBT_MOVESIZE |
Система собирается переместить окно или изменить его |
|
размер. |
HCBT_SETFOCUS |
Система собирается передать окну фокус ввода. |
HCBT_SYSCOMMAND |
Система собирается выполнить системную команду. Перехват |
|
этого сообщения позволяет CBT-приложению запретить |
|
переключение задач с помощью горячих клавиш. |
ХУК WH_DEBUG
Windows вызывает функцию хука WH_DEBUG перед вызовом функции любого другого хука, установленного в системе. Таким образом, этот хук можно использовать для того, чтобы запретить системе вызывать функции других хуков.
Прототип функции хука:
LRESULT CALLBACK DebugProc( int nCode, // код хука WPARAM wParam, LPARAM lParam )
Если параметр nCode равен HC_ACTION, то функция хука должна обработать данное сообщение. Если nCode меньше нуля, то функция хука должна передать сообщение функции CallNextHookEx(), не обрабатывая его, и должна вернуть значение, которое вернет функция CallNextHookEx().
Параметр wParam указывает, какой тип хука собирается вызвать система.
Параметр lParam указывает на структуру DEBUGHOOKINFO, содержащую параметры, которые будут переданы функции вызываемого хука.
ХУК WH_FOREGROUNDIDLE
позволяет выполнять фоновые задачи, когда поток, на который установлен хук, не используется.
Функция этого хука вызывается, когда система собирается сделать основной поток приложения неактивным.
ХУК WH_GETMESSAGE
Этот хук позволяет приложению контролировать сообщения, которые функция GetMessage() или PeekMessage() собирается извлечь из очереди сообщений.
Хук WH_GETMESSAGE можно использовать для просмотра сообщений, полученных от мыши или клавиатуры, а также других сообщений, помещаемых в очередь сообщений.
ХУК WH_JOURNALPLAYBACK
позволяет приложению помещать сообщения в системную очередь сообщений. Этот хук можно использовать для того, чтобы проигрывать серию событий от мыши или клавиатуры, которая прежде была записана с помощью хука WH_JOURNALRECORD. Если этот хук установлен, нормальный ввод от мыши и клавиатуры блокируется до тех пор, пока хук не будет снят. Хук WH_JOURNALPLAYBACK может быть только глобальным, т.е. его нельзя установить для отдельного потока.
Хук WH_JOURNALPLAYBACK возвращает время ожидания (time-out value). Это значение сообщает системе, сколько миллисекунд нужно подождать прежде чем обработать данное сообщение из серии событий. Таким образом, хук может контролировать периодичность проигрываемых событий.