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