Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Низкоуровневый перехват мыши


Автор: ProgrammistDelphi 25.5.2005, 10:24
Как перехватывать события от мыши с помощью низкоуровневого фильтра
WH_MOUSE_LL. И чем он отличается от обычного.

Просто когда ставишь фильтр WH_MOUSE, мышь в состоянии убрать фокус с какого либо объекта, например с едита, но при этом проде как кнопки не работают.

Если кто то может объяснить, не сочтите за труд.

Автор: Rouse_ 26.5.2005, 11:04
По сути своей WH_JOURNAL, WH_MOUSE_LL и WH_KEYBOARD_LL не являются глобальными хуками. Они работают с RawInputThread, поэтому им нет необходимости быть в контексте разных процессов. В отличие от классических хуков.
Цитата(ProgrammistDelphi @ 25.5.2005, 11:24)
Просто когда ставишь фильтр WH_MOUSE, мышь в состоянии убрать фокус с какого либо объекта, например с едита, но при этом проде как кнопки не работают.

Вот это не понял...
Добавлено @ 11:06
Да, ну и перхватывать аналогично как и в обычных хуках.

SetWindowsHookEx и указатель на функцию которая будет обрабатывать сообщения пришедшие от ловушки...

Автор: poor_yorik 9.6.2005, 15:41
Ну вот один из найдных мною перехватчиков мыши...

Код

library Hookdemo;

uses

Beeper in '\DELDEMOS\HOOKDEMO\BEEPER.PAS';

exports

SetHook index 1,
UnHookHook index 2,
HookProc index 3;

begin

HookedAlready:=False;
end.




А вот BEEPER.PAS.

Код

unit Beeper;

interface

uses Wintypes, Winprocs, Messages;

function SetHook: Boolean; export;
function UnHookHook: Boolean; export;
function HookProc(Code: integer; wParam: Word;
  lParam: Longint): Longint; export;

var
  HookedAlready: Boolean;

implementation

var
  ourHook: HHook;

function SetHook: Boolean;
begin
  if HookedAlready then
    exit;
  ourHook := SetWindowsHookEx(WH_MOUSE, HookProc, HInstance, 0);
  HookedAlready := True;
end;

function UnHookHook: Boolean;
begin
  UnHookWindowsHookEx(ourHook);
  HookedAlready := False;
end;

function HookProc(Code: integer; wParam: Word;
  lParam: Longint): Longint;
begin
  if (wParam = WM_LBUTTONDOWN) then
    MessageBeep(0);
  result := CallNextHookEx(ourHook, Code, wParam, lParam);
end;

end.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)