1. KeyHook не рекомендуется использовать, т.к. требует hook.dll, к-ый часто определяется как вирус (хотя вируса там нет). А если запустить две программы с этим компонентом, то одна из них будет дважды реагировать на одно нажатие, вторая - ни разу. Иными словами, перехват только для одной программы.
2. gmousehook - что это за компонент? Никто не будет искать по сайту (где и поиск-то не работает) неизвестный компонент, а потому помочь мало кто сможет.
Поэтому для перехвата мыши и клавы советую использовать IC вместо сторонних компонентов:
Add(MainForm,2953706,63,105) { Width=380 Position=1 Point(Handle) Point(onClose) link(onCreate,14028631:doEvent1,[]) link(onClose,3179091:In,[(107,132)(107,146)]) } Add(InlineCode,12360657,252,343) { @Hint=#24:Глобальный перехват мыши| EventPoints=#2:ev| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|17: ev:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|30: str := Int2Str(w)+Int2Str(d);|25: _hi_OnEvent(hac.ev,str);|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.| link(ev,14423304:doAdd,[]) } Add(Memo,14423304,441,343) { Left=10 Top=5 Width=160 Height=260 AddType=1 ScrollBars=2 } Add(InfoTip,13344029,238,112) { Info=#20:5120 - движение мыши|55:522ХХХ - прокрутка колеса, где ХХХ - значение прокрутки|18:5130 - нажатие ЛКМ|21:5140 - отпускание ЛКМ|18:5160 - нажатие ПКМ|21:5170 - отпускание ПКМ|21:5190 - нажатие колеса|24:5200 - отпускание колеса|33:5231 - нажатие 1-й боковой кнопки|36:5241 - отпускание 1-й боковой кнопки|33:5232 - нажатие 2-й боковой кнопки|35:5242 - отпускание 2-й боковй кнопки|0:|62:В нижнем IC та же суть, только каждое событие имеет свою точку| Frame=2 Transparent=1 HAlign=0 Width=358 Height=193 Margin=5 } Add(WinTools,15561254,189,112) { link(Handle,10391384:Var,[]) } Add(InlineCode,10339731,252,399) { @Hint=#24:Глобальный перехват мыши| EventPoints=#11:onMouseMove|13:onLButtonDown|11:onLButtonUp|13:onRButtonDown|11:onRButtonUp|11:onWheelDown|9:onWheelUp|8:onScroll|14:onX1ButtonDown|11:onX1BttonUp|14:onX2ButtonDown|11:onX2BttonUp| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: onMouseMove:THI_Event;|28: onLButtonDown:THI_Event;|26: onLButtonUp:THI_Event;|28: onRButtonDown:THI_Event;|26: onRButtonUp:THI_Event;|26: onWheelDown:THI_Event;|24: onWheelUp:THI_Event;|23: onScroll:THI_Event;|29: onX1ButtonDown:THI_Event;|27: onX1ButtonUp:THI_Event;|29: onX2ButtonDown:THI_Event;|27: onX2ButtonUp:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|10: case w of|36: 512: _hi_OnEvent(hac.onMouseMove);|38: 513: _hi_OnEvent(hac.onLButtonDown);|36: 514: _hi_OnEvent(hac.onLButtonUp);|38: 516: _hi_OnEvent(hac.onRButtonDown);|36: 517: _hi_OnEvent(hac.onRButtonUp);|36: 519: _hi_OnEvent(hac.onWheelDown);|34: 520: _hi_OnEvent(hac.onWheelUp);|45: 522: _hi_OnEvent(hac.onScroll, int2str(d));|12: 523: begin|17: case d of|44: 1: _hi_OnEvent(hac.onX1ButtonDown);|44: 2: _hi_OnEvent(hac.onX2ButtonDown);|12: end;|11: end;|12: 524: begin|17: case d of|42: 1: _hi_OnEvent(hac.onX1ButtonUp);|42: 2: _hi_OnEvent(hac.onX2ButtonUp);|12: end;|11: end;|5: end;|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.| } Add(InlineCode,2317400,252,595) { @Hint=#49:Глобальный перехват клавиатуры (Вариант от Ivann)| WorkPoints=#7:SetHook|6:UnHook| EventPoints=#7:onKeyUp|9:onKeyDown|10:onSysKeyUp|12:onSysKeyDown| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|40: procedure onKey(param,code:integer);|9: public|56: onKeyUp,onKeyDown,onSysKeyUp,onSysKeyDown:THI_Event;|4: |46: procedure SetHook(var dt:TData; Idx:WORD);|45: procedure UnHook(var dt:TData; Idx:WORD);|5: end;|0:|14:implementation|0:|5:const|21: WH_KEYBOARD_LL = $D;|0:|4:var |12: Hook:HHOOK;|45: ret:procedure(param,code:integer) of object;|0:|82:function HookProc(Code: integer; wParam:integer;lParam: LongInt): HRESULT;stdcall;|5:begin|35: ret(wParam,PInteger(lParam)^); |55: result := CallNextHookEx(Hook, Code, wParam , lParam);|4:end;|0:|30:procedure THiAsmClass.SetHook;|5:begin|12: ret:=onKey;|64: Hook := SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0);|4:end;|0:|28:procedure THiAsmClass.onKey;|5:begin|16: Case Param of|45: WM_KEYDOWN :_hi_OnEvent(onKeyDown,code);|43: WM_KEYUP :_hi_OnEvent(onKeyUp,code);|48: WM_SYSKEYDOWN:_hi_OnEvent(onSysKeyDown,code);|46: WM_SYSKEYUP :_hi_OnEvent(onSysKeyUp,code);|9: end; |4:end;|68:{Сообщение WM_SYSKEYDOWN посылается окну с фокусом клавиатуры тогда,|83:когда пользователь удерживает нажатой клавишу ALT, а затем нажимает другую клавишу.|92:Это происходит также тогда, когда никакое окно в настоящее время не имеет фокуса клавиатуры;|65:в этом случае сообщение WM_SYSKEYDOWN посылается активному окну.}|0:|29:procedure THiAsmClass.UnHook;|5:begin|27: UnhookWindowsHookEx(Hook);|4:end;|0:|4:end.| link(onKeyUp,3658577:doWork1,[]) link(onKeyDown,3658577:doWork2,[]) link(onSysKeyUp,3658577:doWork3,[]) link(onSysKeyDown,3658577:doWork4,[]) } Add(ListBox,11565061,476,560) { Left=180 Top=5 Width=180 Height=260 } Add(StrList,4095676,378,553) { Strings=#8:WM_KEYUP|10:WM_KEYDOWN|11:WM_SYSKEYUP|13:WM_SYSKEYDOWN| Point(doGetString) Point(onGetString) link(onGetString,9575750:doString,[]) } Add(ChanelToIndex,3658577,301,595) { Count=4 Point(Data) link(onIndex,4095676:doGetString,[]) } Add(FormatStr,9575750,420,560) { link(onFString,11565061:doAdd,[]) link(Str2,3658577:Data,[(433,548)(370,548)(370,639)(307,639)]) } Add(Hub,14028631,119,119) { link(onEvent1,15561254:doPopup,[]) link(onEvent2,2362015:In,[]) } Add(LineBreak,4352888,210,595) { link(Out,2317400:SetHook,[]) Primary=[2362015,-63,-469] } Add(LineBreak,11715000,63,147) { Type=1 link(Data,2953706:Handle,[]) Primary=[10391384,126,-63] } Add(LineBreak,6859518,210,602) { link(Out,2317400:UnHook,[]) Primary=[3179091,-91,-462] }
ps. Ну, не буду и против вознаграждения, если сочтёте нужным.
|