Программирование на Visual C++. Архив рассылки - Алекс Jenter
Шрифт:
Интервал:
Закладка:
hooksdll.exp: hooksdll.obj hooksdll.def
$(implib) –machine:$(CPU)
–def:hooks.def
hooksdll.obj
–out:hooksdll.lib
Прилинковывает получившийся файл HOOKSDLL.EXP:
hooksdll.dll: hooksdll.obj hooksdll.def hooksdll.lib hooksdll.exp
$(link) $(linkdebug)
–base:0x1C000000
–dll
–entry:LibMain$(DLLENTRY)
–out:hooksdll.dll
hooksdll.exp hooksdll.obj hooksdll.rbj
$(guilibsdll)
Типы хуков WH_CALLWNDPROCWindows вызывает этот хук при каждом вызове функции SendMessage. Фильтрующей функции передается код хука, показывающий, была ли произведена посылка сообщения из текущего потока, а также указатель на структуру с информацией о сообщении.
Структура CWPSTRUCT описана следующим образом:
typedef struct tagCWPSTRUCT {
LPARAM lParam;
WPARAM wParam;
DWORD message;
HWND hwnd;
} CWPSTRUCT, *PCWPSTRUCT, NEAR *NPCWPSTRUCT, FAR *LPCWPSTRUCT;
Фильтры могут обработать сообщение, но не могут изменять его (хотя это было возможно в Win16). Сообщение затем отсылается той функции, которой и предназначалось. Этот хук использует значительное количество системных ресурсов, особенно, когда он установлен с системной областью видимости, поэтому используйте его только в целях отладки.
WH_CBTЧтобы написать приложение для интерактивного обучения (CBT application), разработчик должен координировать его работу с работой приложения, для которого оно разрабатывается. Для достижения этой цели Windows предоставляет разработчикам хук WH_CBT. Windows передает фильтрующей функции код хука, показывающий, какое произошло событие, и соответствующие этому событию данные.
Фильтр для хука WH_CBT должен знать о десяти хуковых кодах:
• HCBT_ACTIVATE
• HCBT_CREATEWND
• HCBT_DESTROYWND
• HCBT_MINMAX
• HCBT_MOVESIZE
• HCBT_SYSCOMMAND
• HCBT_CLICKSKIPPED
• HCBT_KEYSKIPPED
• HCBT_SETFOCUS
• HCBT_QS
HCBT_ACTIVATEWindows вызывает хук WH_CBT с этим кодом при активации какого-нибудь окна. Когда хук WH_CBT установлен как локальный, это окно должно принадлежать потоку, на который установлен хук. Если фильтр в ответ на это событие вернет TRUE, окно не будет активизировано.
Параметр wParam содержит хэндл активизируемого окна. В lParam содержится указатель на структуру CBTACTIVATESTRUCT, которая описана следующим образом:
typedef struct tagCBTACTIVATESTRUCT {
BOOL fMouse; // TRUE, если активация наступила в результате
// мышиного клика; иначе FALSE.
HWND hWndActive; // Содержит хэндл окна, активного
// в настоящий момент.
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
HCBT_CREATEWNDWindows вызывает хук WH_CBT с этим при создании окна. Когда хук установлен как локальный, это окно должно создаваться потоком, на который установлен хук. Хук WH_CBT вызывается до того, как Windows пошлет новому окну сообщения WM_GETMINMAXINFO, WM_NCCREATE, или WM_CREATE. Таким образом, фильтрующая функция может запретить создание окна, вернув TRUE.
В параметре wParam содержится хэндл создаваемого окна. В lParam – указатель на следующую структуру.
/*
* данные для HCBT_CREATEWND, на которые указывает lParam
*/
struct CBT_CREATEWND {
struct tagCREATESTRUCT *lpcs; // Данные для создания
// нового окна.
HWND hwndInsertAfter; // Хэндл окна, после которого будет
// добавлено это окно (Z-order).
} CBT_CREATEWND, *LPCBT_CREATEWND;
Функция-фильтр может изменить значение hwndInsertAfter или значения в lpcs.
HCBT_DESTROYWNDWindows вызывает хук WH_CBT с этим кодом перед уничтожением какого-либо окна. Если хук является локальным, это окно должно принадлежать потоку, на который установлен хук. Windows вызывает хук WH_CBT до посылки сообщения WM_DESTROY. Если функция-фильтр вернет TRUE, окно не будет уничтожено.
Параметр wParam содержит хэндл уничтожаемого окна. В lParam находится 0L.
HCBT_MINMAXWindows вызывает хук WH_CBT с этим кодом перед минимизацией или максимизацией окна. Когда хук установлен как локальный, это окно должно принадлежать потоку, на который установлен хук. Если фильтр вернет TRUE, действие будет отменено.
В wParam передается хэндл окна, которое готовится к максимизации/минимизации. lParam содержит одну из SW_*-констант, определенных в WINUSER.H и описывающих операцию над окном.
HCBT_MOVESIZEWindows вызывает хук WH_CBT с этим кодом перед перемещением или изменением размеров окна, сразу после того, как пользователь закончил выбор новой позиции или размеров окна. Если хук установлен как локальный, это окно должно принадлежать потоку, на который установлен хук. Если фильтр вернет TRUE, действие будет отменено.
В wParam передается хэндл перемещаемогоизменяемого окна. lParam содержит LPRECT, который указывает на новые координаты окна.
HCBT_SYSCOMMANDWindows вызывает хук WH_CBT с этим кодом во время обработки системной команды. Если хук установлен как локальный, окно, чье системное меню вызвало данное событие, должно принадлежать потоку, на который установлен хук. Хук WH_CBT вызывается из функции DefWindowsProc. Если приложение не передает сообщение WH_SYSCOMMAND функции DefWindowsProc, это хук не получит управление. Если функция-фильтр вернет TRUE, системная команда не будет выполнена.
В wParam содержится системная команда (SC_TASKLIST, SC_HOTKEY, и так далее), готовая к выполнению. Если в wParam передается SC_HOTKEY, в младшем слове (LOWORD) lParam содержится хэндл окна, к которому относится горячая клавиша. Если в wParam передается любое другое значение и если команда системного меню была выбрана мышью, в младшем слове lParam будет находиться горизонтальная позиция, а в старшем слове (HIWORD) – вертикальная позиция указателя мыши.
Следующие системные команды приводят к срабатыванию этого хука изнутри DefWindowProc:
SC_CLOSE Закрыть окно. SC_HOTKEY Активировать окно, связанное с определенной горячей клавишей. SC_HSCROLL Горизонтальная прокрутка. SC_KEYMENU Выполнить команду меню по комбинации клавиш. SC_MAXIMIZE Распахнуть окно. SC_MINIMIZE Минимизировать окно. SC_MOUSEMENU Выполнить команду меню по щелчку мыши. SC_MOVE Переместить окно. SC_NEXTWINDOW Перейти к следующему окну. SC_PREVWINDOW Перейти к предыдущему окну. SC_RESTORE Сохранить предыдущие координаты (контрольная точка – checkpoint). SC_SCREENSAVE Запустить хранитель экрана. SC_SIZE Изменить размер окна. SC_TASKLIST Запустить или активировать Планировщик Задач (Windows Task Manager). SC_VSCROLL Вертикальная прокрутка. HCBT_CLICKSKIPPEDWindows вызывает хук WH_CBT с этим кодом при удалении события от мыши из входной очереди потока, в случае, если установлен хук мыши. Windows вызовет системный хук, когда из какой-либо входной очереди будет удалено событие от мыши и в системе установлен либо глобальный, либо локальный хук мыши. Данный код передается только в том случае, если к хуку WH_MOUSE прикреплена фильтрующая функция. Несмотря на свое название, HCBT_CLICKSKIPPED генерируется не только для пропущенных событий от мыши, но и в случае, когда событие от мыши удаляется из системной очереди. Его главное назначение — установить хук WH_JOURNALPLAYBACK в ответ на событие мыши. (За дополнительной информацией обратитесь к секции "WM_QUEUESYNC".)
В wParam передается идентификатор сообщения мыши – например, WM_LBUTTONDOWN или любое из сообщений WM_?BUTTON*. lParam содержит указатель на структуру MOUSEHOOKSTRUCT, которая описана следующим образом:
typedef struct tagMOUSEHOOKSTRUCT {
POINT pt; // Позиция курсора мыши в координатах экрана
HWND hwnd; // Окно, получающее сообщение
UINT wHitTestCode; // Результат проверки координат (hit-testing)
DWORD dwExtraInfo; // Доп.информация о сообщении
} MOUSEHOOKSTRUCT, FAR *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
HCBT_KEYSKIPPEDWindows вызывает хук WH_CBT с этим кодом при удалении клавиатурного события из системной очереди, в случае, если установлен клавиатурный хук. Windows вызовет системный хук, когда из какой-либо входной очереди будет удалено событие от клавиатуры и в системе установлен либо глобальный, либо локальный клавиатурный хук. Данный код передается только в том случае, если к хуку WH_KEYBOARD прикреплена фильтрующая функция. Несмотря на свое название, HCBT_KEYSKIPPED генерируется не только для пропущенных клавиатурных событий, но и в случае, когда клавиатурное событие удаляется из системной очереди. Его главное назначение — установить хук WH_JOURNALPLAYBACK в ответ на клавиатурное событие. (За дополнительной информацией обратитесь к секции "WM_QUEUESYNC".)