Implement WH_MOUSE_LL hook

svn path=/trunk/; revision=15284
This commit is contained in:
Gé van Geldorp 2005-05-14 19:09:02 +00:00
parent c7e747c1fa
commit 2832134fbc
6 changed files with 68 additions and 9 deletions

View file

@ -281,7 +281,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra;
WPARAM wParam; WPARAM wParam;
LPARAM lParam; LPARAM lParam;
KBDLLHOOKSTRUCT *KeyboardLlData; PKBDLLHOOKSTRUCT KeyboardLlData;
PMSLLHOOKSTRUCT MouseLlData;
Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments;
@ -355,9 +356,13 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
} }
break; break;
case WH_KEYBOARD_LL: 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); Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) KeyboardLlData);
break; break;
case WH_MOUSE_LL:
MouseLlData = (PMSLLHOOKSTRUCT)((PCHAR) Common + Common->lParam);
Result = Common->Proc(Common->Code, Common->wParam, (LPARAM) MouseLlData);
break;
default: default:
return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED);
} }

View file

@ -296,6 +296,9 @@ IntCallHookProc(INT HookId,
case WH_KEYBOARD_LL: case WH_KEYBOARD_LL:
ArgumentLength += sizeof(KBDLLHOOKSTRUCT); ArgumentLength += sizeof(KBDLLHOOKSTRUCT);
break; break;
case WH_MOUSE_LL:
ArgumentLength += sizeof(MSLLHOOKSTRUCT);
break;
default: default:
DPRINT1("Trying to call unsupported window hook %d\n", HookId); DPRINT1("Trying to call unsupported window hook %d\n", HookId);
return 0; return 0;
@ -350,6 +353,10 @@ IntCallHookProc(INT HookId,
RtlCopyMemory(Extra, (PVOID) lParam, sizeof(KBDLLHOOKSTRUCT)); RtlCopyMemory(Extra, (PVOID) lParam, sizeof(KBDLLHOOKSTRUCT));
Common->lParam = (LPARAM) (Extra - (PCHAR) Common); Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
break; break;
case WH_MOUSE_LL:
RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MSLLHOOKSTRUCT));
Common->lParam = (LPARAM) (Extra - (PCHAR) Common);
break;
} }
ResultPointer = &Result; ResultPointer = &Result;

View file

@ -266,7 +266,7 @@ IntCallLowLevelHook(INT HookId, INT Code, WPARAM wParam, LPARAM lParam, PHOOK Ho
/* FIXME should get timeout from /* FIXME should get timeout from
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
Status = MsqSendMessage(Hook->Thread->Tcb.Win32Thread->MessageQueue, (HWND) Code, HookId, 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; return NT_SUCCESS(Status) ? uResult : 0;
} }

View file

@ -515,6 +515,7 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd,
{ {
PUSER_MESSAGE UserMsg; PUSER_MESSAGE UserMsg;
MSG Msg; MSG Msg;
BOOL ProcessMessage;
ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE); ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE);
Msg = SystemMessageQueue[SystemMessageQueueHead]; Msg = SystemMessageQueue[SystemMessageQueueHead];
@ -522,12 +523,48 @@ MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd,
(SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE;
SystemMessageQueueCount--; SystemMessageQueueCount--;
IntUnLockSystemMessageQueue(OldIrql); IntUnLockSystemMessageQueue(OldIrql);
UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST)
/* What to do if out of memory? For now we just panic a bit in debug */ {
ASSERT(UserMsg); MSLLHOOKSTRUCT MouseHookData;
UserMsg->FreeLParam = FALSE;
UserMsg->Msg = Msg; MouseHookData.pt.x = GET_X_LPARAM(Msg.lParam);
InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); 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); IntLockSystemMessageQueue(OldIrql);
} }
/* /*

View file

@ -27,6 +27,7 @@
#include <math.h> #include <math.h>
#include <float.h> #include <float.h>
#include <windows.h> #include <windows.h>
#include <windowsx.h>
#include <rosrtl/string.h> #include <rosrtl/string.h>
#include <user32/callback.h> #include <user32/callback.h>

View file

@ -2151,6 +2151,7 @@ extern "C" {
#define LLKHF_INJECTED 0x00000010 #define LLKHF_INJECTED 0x00000010
#define LLKHF_ALTDOWN 0x00000020 #define LLKHF_ALTDOWN 0x00000020
#define LLKHF_UP 0x00000080 #define LLKHF_UP 0x00000080
#define LLMHF_INJECTED 0x00000001
#if (WINVER >= 0x0500) #if (WINVER >= 0x0500)
#define FLASHW_STOP 0 #define FLASHW_STOP 0
#define FLASHW_CAPTION 1 #define FLASHW_CAPTION 1
@ -3065,6 +3066,14 @@ typedef struct tagKBDLLHOOKSTRUCT {
DWORD time; DWORD time;
DWORD dwExtraInfo; DWORD dwExtraInfo;
} KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT; } 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) #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410)
typedef struct { typedef struct {
UINT cbSize; UINT cbSize;