From 2832134fbcd1b2085adc2bdf85f3917b354de5b7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=A9=20van=20Geldorp?= Date: Sat, 14 May 2005 19:09:02 +0000 Subject: [PATCH] Implement WH_MOUSE_LL hook svn path=/trunk/; revision=15284 --- reactos/lib/user32/windows/hook.c | 9 ++++- reactos/subsys/win32k/ntuser/callback.c | 7 ++++ reactos/subsys/win32k/ntuser/hook.c | 2 +- reactos/subsys/win32k/ntuser/msgqueue.c | 49 ++++++++++++++++++++++--- reactos/subsys/win32k/w32k.h | 1 + reactos/w32api/include/winuser.h | 9 +++++ 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/reactos/lib/user32/windows/hook.c b/reactos/lib/user32/windows/hook.c index ca36e087bd2..38bfbd8e07e 100644 --- a/reactos/lib/user32/windows/hook.c +++ b/reactos/lib/user32/windows/hook.c @@ -281,7 +281,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; WPARAM wParam; LPARAM lParam; - KBDLLHOOKSTRUCT *KeyboardLlData; + PKBDLLHOOKSTRUCT KeyboardLlData; + PMSLLHOOKSTRUCT MouseLlData; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; @@ -355,9 +356,13 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) } break; case WH_KEYBOARD_LL: - KeyboardLlData = (KBDLLHOOKSTRUCT *)((PCHAR) Common + Common->lParam); + KeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) KeyboardLlData); break; + case WH_MOUSE_LL: + MouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); + Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MouseLlData); + break; default: return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); } diff --git a/reactos/subsys/win32k/ntuser/callback.c b/reactos/subsys/win32k/ntuser/callback.c index 84f5f6e82bb..2c143e009d1 100644 --- a/reactos/subsys/win32k/ntuser/callback.c +++ b/reactos/subsys/win32k/ntuser/callback.c @@ -296,6 +296,9 @@ IntCallHookProc(INT HookId, case WH_KEYBOARD_LL: ArgumentLength += sizeof(KBDLLHOOKSTRUCT); break; + case WH_MOUSE_LL: + ArgumentLength += sizeof(MSLLHOOKSTRUCT); + break; default: DPRINT1("Trying to call unsupported window hook %d\n", HookId); return 0; @@ -350,6 +353,10 @@ IntCallHookProc(INT HookId, RtlCopyMemory(Extra, (PVOID) lParam, sizeof(KBDLLHOOKSTRUCT)); Common->lParam = (LPARAM) (Extra - (PCHAR) Common); break; + case WH_MOUSE_LL: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MSLLHOOKSTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; } ResultPointer = &Result; diff --git a/reactos/subsys/win32k/ntuser/hook.c b/reactos/subsys/win32k/ntuser/hook.c index 87fadc97631..b7b2f5b67e4 100644 --- a/reactos/subsys/win32k/ntuser/hook.c +++ b/reactos/subsys/win32k/ntuser/hook.c @@ -266,7 +266,7 @@ IntCallLowLevelHook(INT HookId, INT Code, WPARAM wParam, LPARAM lParam, PHOOK Ho /* FIXME should get timeout from * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ Status = MsqSendMessage(Hook->Thread->Tcb.Win32Thread->MessageQueue, (HWND) Code, HookId, - wParam, lParam, /*500*/0, TRUE, TRUE, &uResult); + wParam, lParam, 5000, TRUE, TRUE, &uResult); return NT_SUCCESS(Status) ? uResult : 0; } diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index a3179e10fa4..92984444e22 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.c @@ -515,6 +515,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, { PUSER_MESSAGE UserMsg; MSG Msg; + BOOL ProcessMessage; ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE); Msg = SystemMessageQueue[SystemMessageQueueHead]; @@ -522,12 +523,48 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount--; IntUnLockSystemMessageQueue(OldIrql); - UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); - /* What to do if out of memory? For now we just panic a bit in debug */ - ASSERT(UserMsg); - UserMsg->FreeLParam = FALSE; - UserMsg->Msg = Msg; - InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); + if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST) + { + MSLLHOOKSTRUCT MouseHookData; + + MouseHookData.pt.x = GET_X_LPARAM(Msg.lParam); + MouseHookData.pt.y = GET_Y_LPARAM(Msg.lParam); + switch(Msg.message) + { + case WM_MOUSEWHEEL: + MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg.wParam)); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONUP: + case WM_NCXBUTTONDBLCLK: + MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg.wParam)); + break; + default: + MouseHookData.mouseData = 0; + break; + } + MouseHookData.flags = 0; + MouseHookData.time = Msg.time; + MouseHookData.dwExtraInfo = 0; + ProcessMessage = (0 == HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, + Msg.message, (LPARAM) &MouseHookData)); + } + else + { + ProcessMessage = TRUE; + } + if (ProcessMessage) + { + UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); + /* What to do if out of memory? For now we just panic a bit in debug */ + ASSERT(UserMsg); + UserMsg->FreeLParam = FALSE; + UserMsg->Msg = Msg; + InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); + } IntLockSystemMessageQueue(OldIrql); } /* diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index 5f99ce30ea1..892a2067274 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 4c1a681671a..99d7e16b0c2 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -2151,6 +2151,7 @@ extern "C" { #define LLKHF_INJECTED 0x00000010 #define LLKHF_ALTDOWN 0x00000020 #define LLKHF_UP 0x00000080 +#define LLMHF_INJECTED 0x00000001 #if (WINVER >= 0x0500) #define FLASHW_STOP 0 #define FLASHW_CAPTION 1 @@ -3065,6 +3066,14 @@ typedef struct tagKBDLLHOOKSTRUCT { DWORD time; DWORD dwExtraInfo; } KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT; +typedef struct tagMSLLHOOKSTRUCT +{ + POINT pt; + DWORD mouseData; + DWORD flags; + DWORD time; + ULONG_PTR dwExtraInfo; +} MSLLHOOKSTRUCT, *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT; #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) typedef struct { UINT cbSize; -- 2.17.1