FAQ по C/C++/Visual C++
Работа с сетью Как установить хук |
Составители: SUnteXx, Leprecon |
Как установить хук | |||
hHookDll = LoadLibrary("hook_dll.dll");А далее, чтобы установить хук вызываем SetHook(TRUE), чтобы снять - SetHook(FALSE). А вот, непосредственно, сама ф-ция установки/удаления хука. int SetHook(BOOL bSet) // Функция устанавливает/снимает хук в зависимости от bSet { if(bSet) // Если устанавливаем { if(hHookDll) // Если загружена библиотека { hpHookProc = (HOOKPROC)GetProcAddress(hHookDll, "?HookProc@@YGJHIJ@Z"); // Получим адрес хук-функции if(hpHookProc) // Если успешно получен адрес ф-ции, { // то установим хук hHook = SetWindowsHookEx(WH_GETMESSAGE, // тип хука (HOOKPROC)hpHookProc, // хук-функция hHookDll, // хендл библиотеки с хук-функцией NULL); if(hHook == NULL) // Если хук не установился, вернем ошибку return 3; } else return 1; } else return 2; } else // Если снимаем хук UnhookWindowsHookEx(hHook); return 0; }Выше приведенная ф-ция возвращает номер ошибки. Вот что означает каждая из них: 1) Функцию HookProc не удалось загрузить из нашей библиотеки 2) Нашу библиотеку не удалось загрузить 3) Хук не установлен Если ф-ция вернула 0, это означает, что ошибок не произошло и хук установлен. Осталось только ловить мессаги. В библиотеке нужно сделать одну функцию: __declspec(dllexport) LRESULT CALLBACK HookProc(int iCode, WPARAM wParam, LPARAM lParam) {// Если использовать это функцию для WH_GETMESSAGE, то что бы вы не нажимали будет писАться 'a' :-) // iCode - сообщает хук-функции о том, что делать с данными if(iCode>=0) // Если iCode>=0, то данные нужно обработать { MSG *msg = (MSG*)lParam; // Сообщение, получаемое некоторым окном if(msg->message == WM_CHAR) // Если сообщение WM_CHAR, т.е. юзверь нажал кнопку на клавиатуре, { msg->wParam = (WPARAM)'a'; // то заменим введенный символ на 'a' } } else // Если iCode return CallNextHookEx(NULL, iCode, wParam, lParam); return 0; } |
Сначала грузим нашу библиотеку, в которой будем обрабатывать сами сообщения |||
|
FAQ составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |