library GlobalHooks; uses Windows; {$R *.res} const WH_KEYBOARD_LL = 13; WH_MOUSE_LL = 14; type TKeyboardHook = record Hook: HHOOK; Callback: function(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; end; TMouseHook = record Hook: HHOOK; Callback: function(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; end; var KeyboardHook: TKeyboardHook; MouseHook: TMouseHook; function KeyboardHookCallback(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if (nCode = HC_ACTION) and ((wParam = WM_KEYDOWN) or (wParam = WM_KEYUP)) then begin // 处理键盘事件 // ... end; Result := CallNextHookEx(KeyboardHook.Hook, nCode, wParam, lParam); end; function MouseHookCallback(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if (nCode = HC_ACTION) and ((wParam = WM_LBUTTONDOWN) or (wParam = WM_LBUTTONUP) or (wParam = WM_RBUTTONDOWN) or (wParam = WM_RBUTTONUP)) then begin // 处理鼠标事件 // ... end; Result := CallNextHookEx(MouseHook.Hook, nCode, wParam, lParam); end; function InstallKeyboardHook(Callback: function(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT): Boolean; begin Result := False; if not Assigned(Callback) then Exit; if Assigned(KeyboardHook.Callback) then Exit; KeyboardHook.Hook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHookCallback, HInstance, 0); if KeyboardHook.Hook = 0 then Exit; KeyboardHook.Callback := Callback; Result := True; end; function InstallMouseHook(Callback: function(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT): Boolean; begin Result := False; if not Assigned(Callback) then Exit; if Assigned(MouseHook.Callback) then Exit; MouseHook.Hook := SetWindowsHookEx(WH_MOUSE_LL, @MouseHookCallback, HInstance, 0); if MouseHook.Hook = 0 then Exit; MouseHook.Callback := Callback; Result := True; end; function RemoveKeyboardHook: Boolean; begin Result := False; if KeyboardHook.Hook = 0 then Exit; if UnhookWindowsHookEx(KeyboardHook.Hook) then begin KeyboardHook.Hook := 0; KeyboardHook.Callback := nil; Result := True; end; end; function RemoveMouseHook: Boolean; begin Result := False; if MouseHook.Hook = 0 then Exit; if UnhookWindowsHookEx(MouseHook.Hook) then begin MouseHook.Hook := 0; MouseHook.Callback := nil; Result := True; end; end; exports InstallKeyboardHook, InstallMouseHook, RemoveKeyboardHook, RemoveMouseHook; begin end.