mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 07:56:59 +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;
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue