Работает и для доп. кнопок мыши.

Код:
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(WinTools,15561254,189,112)
{
 link(Handle,10391384:Var,[])
}
Add(Hub,14028631,119,119)
{
 link(onEvent1,15561254:doPopup,[])
 link(onEvent2,2362015:In,[])
}
Add(LineBreak,13407788,63,147)
{
 Type=1
 link(Data,2953706:Handle,[])
 Primary=[10391384,126,-63]
}
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(LineBreak,10173268,210,595)
{
 link(Out,2317400:SetHook,[])
 Primary=[2362015,-63,-469]
}
Add(LineBreak,10963723,210,602)
{
 link(Out,2317400:UnHook,[])
 Primary=[3179091,-91,-462]
}
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.|
}