mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 01:46:21 +00:00
Implement WH_MOUSE_LL hook
svn path=/trunk/; revision=15284
This commit is contained in:
parent
c7e747c1fa
commit
2832134fbc
6 changed files with 68 additions and 9 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/*
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include <rosrtl/string.h>
|
||||
#include <user32/callback.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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue