| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Ловушка сообшений |
| Автор: Proger101 30.6.2007, 18:26 | ||||
| Уважаемые системные прграммисты, простите за(возможно) ламерский вопрос. Я хочу перехватывать все клавиши для всех приложений и для этого ставлю ловушку сообшиний:
Вызов процедур из основного модуля:
Ловушка должна перехватывать нажатие всех клавиш и записывать в файл коды нажатых клавиш. Но проблема в том что callback функция даже не вызывается!!!!! Помогите пожалуста. Заранее благодарен. |
| Автор: Ak47black 30.6.2007, 23:44 |
| Если не хочешь писать весь код возьми этот бесплатный. Если хочешь сам написать то сорри, может тебе кто другой пояснить. |
| Автор: ilyalyu 2.7.2007, 22:26 | ||
| При написании такого приложение есть два момента: 1. Hook надо создавать не внутри приложения, а в отдельной DLL. 2. Информацию от DLL к приложению надо передавать с помощью сообщений (windows messages), а не с помощью callback functions. Вот как это примерно выглядит:
|
| Автор: mr.Anderson 2.7.2007, 22:32 | ||||
Далеко не факт. Могу предоставить функцию для перехвата нажатий любых клавиш, которую пишем прямо в модуле программы, безо всяких DLL, что очень удобно. А вообще, все зависит от задачи. Если требуется отловить клавиши только в пределах формы приложения, то вполне хватит переопределения AppMsg.
|
| Автор: Ak47black 2.7.2007, 23:55 | ||
Интересно как если можно, я вроде думал всегда что надо через Dll перехватывать ( или дрова писать, там что угодно перехватить тогда можно) так как по идее простому окну от всех окон сообщения не приходят. И действует-ли твой метод на виндах от 98 по vista? |
| Автор: MetalFan 3.7.2007, 06:41 |
есть понятие локального и глобального хука. локальный действует - в пределах приложения. |
| Автор: mr.Anderson 3.7.2007, 09:52 | ||||||||
| Действует ли на Vista - понятия не имею, с ней никогда не работал. А вот на 98 работать должно вполне. Насчет пределов приложения - я специально проверил, работает в пределах всей системы, даже если окно программы свернуто и неактивно. Итак, поехали. В главном модуле программы рисуем функцию:
Объявляем глобальную переменную:
Затем в OnCreate формы ставим хук:
На OnClose формы:
Запускаем и радуемся. |
| Автор: Rennigth 3.7.2007, 10:20 |
| Автор: mr.Anderson 3.7.2007, 10:36 |
| Rennigth, а почему нет? Я не проверял, правда, дома только XP есть, но почему не должно работать-то? Или там системы хуков нет? |
| Автор: W4FhLF 3.7.2007, 11:00 |
| http://msdn2.microsoft.com/en-us/library/ms644985.aspx |
| Автор: Ak47black 3.7.2007, 11:40 |
| MetalFan, а почему тогда вообще хуком отлавливать если только из своего приложения нужно. Тут просто можно написать свою процедуру обработки окна которая ловит WM_CHAR и хуков не каких ненужно. mr.Anderson, Мда интересно не думал что так можно сделать. Но я лучше буду использовать с dll чтобы не промахнуться на другой винде. |
| Автор: W4FhLF 3.7.2007, 12:27 | ||||
MSDN читаем, DLL тут не причём, это не случайность, а известная feature. from link:
|
| Автор: mr.Anderson 4.7.2007, 16:03 |
| W4FhLF, вот я как раз хочу спросить, раз так, то какая разница - в DLL или в программе ставить хук? Все равно ниже чем на XP не сработает? |
| Автор: dumb 4.7.2007, 16:27 | ||
для всех глобально устанавливаемых хуков(кроме _LL - WH_KEYBOARD_LL/WH_MOUSE_LL) процедуры обработки должны быть помещены в dll. система подгружает эту dll в адресные пространства всех оконных приложений для того, чтобы вызывать процедуру обработки хука в контексте генерирующего событие приложения. для _LL-хуков это не требуется, так как при вызове хук-процедуры происходит переключение в контекст установившего хук приложения(это доходчиво написано в ссылке, приведенной W4FhLFом). для локального хука dll, естественно, тоже не нужна. а это ты откуда выкопал? |
| Автор: Ak47black 4.7.2007, 18:21 | ||
![]() Тут по идее вроде только в 95 непойдёт(если не говорить о предыдуших которыми некто непользуеться почти). Если что нетак поправте. |
| Автор: W4FhLF 4.7.2007, 18:33 |
9x это вообще другая линейка, это ведь даже на приведённом тобою рисунке видно |
| Автор: Ak47black 4.7.2007, 18:37 |
| W4FhLF, ага понятно. А кстати через dll везде пойдёт? |
| Автор: dumb 5.7.2007, 01:46 |
минимальные требования каждого хука написаны в мсдн. "через dll" или не "через dll" - не важно. |
| Автор: mr.Anderson 5.7.2007, 20:51 | ||
О! А раз так, есть ли вообще возможность заблокировать клаву в системах 95/98 ? Ведь для установки хука я пока встречал только SetWindowsHookEx, а ей нужно NT. |
| Автор: dumb 7.7.2007, 00:56 | ||||
не уловил я связи между твоим вопросом и тем, что минимальные требования не зависят от размещения кода хука.
буквы читать умеем? - следуем по http://msdn2.microsoft.com/en-us/library/ms644990.aspx, мотаем в конец и читаем буквы. |
| Автор: hub00 2.6.2008, 15:49 |
| Здравствуйте, помогите решить задачу. Установил глобальный hook = SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0); Необходимо поймать сообщение WM_SETCURSOR. После запуска программы вылетает "Ошибка чтения памяти и её адрес" Однако если использовать hook WH_JOURNALRECORD то программа запускается и такие сообщения как: WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_KEYUP, WM_KEYDOWN ловятся. А вот WM_SETCURSOR Нет. Может я что-то не указываю? Или это сообщение нужно обрабатывать как-то? Спасибо. Листинг : var HookHandle: hHook; function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall; var msg: PEVENTMSG; begin if Code >= 0 then begin result := 0; msg := Pointer(LParam); with Form1 do case msg.message of WM_SETCURSOR : Label1.Caption:='Сообщение получено.'; end; end else result := CallNextHookEx(HookHandle, code, WParam, LParam); end; procedure TForm1.FormCreate(Sender: TObject); begin HookHandle := SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle); end; |