PDA

Просмотр полной версии : Ловушка сообшений


hub00
03.06.2008, 10:01
Здравствуйте, помогите решить задачу.

Установил глобальный 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;

Jes
03.06.2008, 12:55
HookProc у тебя в dll находится?

hub00
03.06.2008, 13:02
нет. Все в одном.

Jes
03.06.2008, 13:15
A global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module.msdn
вообщем обработчик глобального хука должен быть расположен в dll (как раз чтобы избежать проблем с доступом к памяти и тп ...)

ну и коротенький экскурс ( http://www.delphisources.ru/pages/faq/base/create_hook.html )
Подробнее о механизме хуков :http://sources.ru/delphi/dll/hooks_aspects.shtml

Лучше (понятнее) всего о хуках и перехватах у Рихтера описанно

hub00
03.06.2008, 13:32
Изучал я их :(.
Вроде ж делаю как в них и описывается.

0verbreaK
03.06.2008, 16:43
Изучал я их :(.
Вроде ж делаю как в них и описывается.


Вот хорошая статья, с практическим рассмотрением хуков, на мышку, правда язык, ассемблер.
http://www.wasm.ru/article.php?article=1001024

hub00
05.06.2008, 01:31
Вопрос маленький.
Вот я получаю дескрипторе текущего курсора для текущей формы.
a:=GetCursor();
А как сделать так чтоб я его получал за её пределами (глобальный дескриптор курсор)?