![]() |
Ловушка сообшений
Здравствуйте, помогите решить задачу.
Установил глобальный 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; |
HookProc у тебя в dll находится?
|
нет. Все в одном.
|
Цитата:
вообщем обработчик глобального хука должен быть расположен в dll (как раз чтобы избежать проблем с доступом к памяти и тп ...) ну и коротенький экскурс ( http://www.delphisources.ru/pages/fa...eate_hook.html ) Подробнее о механизме хуков :http://sources.ru/delphi/dll/hooks_aspects.shtml Лучше (понятнее) всего о хуках и перехватах у Рихтера описанно |
Изучал я их :(.
Вроде ж делаю как в них и описывается. |
Цитата:
Вот хорошая статья, с практическим рассмотрением хуков, на мышку, правда язык, ассемблер. http://www.wasm.ru/article.php?article=1001024 |
Вопрос маленький.
Вот я получаю дескрипторе текущего курсора для текущей формы. a:=GetCursor(); А как сделать так чтоб я его получал за её пределами (глобальный дескриптор курсор)? |
| Время: 05:35 |