function KeybdHookFn(nCode: LongInt; WPARAM: WPARAM; lParam : LPARAM) : LRESULT; stdcall;
function MouseHookFn(nCode: LongInt; WPARAM: WPARAM; lParam : LPARAM) : LRESULT; stdcall;
// This code in init
kHook := SetWindowsHookEx(wh_keybd_ll, @KeybdHookFn, hInstance, 0);
mHook := SetWindowsHookEx(wh_mouse_ll, @MouseHookFn, hInstance, 0);
stopmouse := false;
// The rest
function KeybdHookFn(nCode: LongInt; WPARAM: WPARAM; lParam : LPARAM) : LRESULT; stdcall;
// possible wParam values: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
var
info : ^KeybdLLHookStruct absolute lParam;
lpChar : word;
kState : TKeyboardState;
begin
result := CallNextHookEx(kHook, nCode, wParam, lParam);
with info^ do
case wParam of
wm_keydown : begin
if vkCode = VK_RMENU then
begin
Host.KeybMemo.Lines.Append(DateTimeToStr(Now()) + ': RMenu down');
stopMouse := true;
end;
end;
wm_keyup: begin
if vkCode = VK_RMENU then
begin
Host.KeybMemo.Lines.Append(DateTimeToStr(Now()) + ': RMenu up');
stopMouse := false;
end;
end;
end;
if Host.KeybMemo.Lines.Count > 8 then
Host.KeybMemo.Lines.Delete(0);
end;
function MouseHookFn(nCode: LongInt; WPARAM: WPARAM; lParam : LPARAM) : LRESULT; stdcall;
// possible wParam values: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP
var
info : ^MouseLLHookStruct absolute lParam;
begin
if not stopMouse then
result := CallNextHookEx(mHook, nCode, wParam, lParam);
end;