From c66063fbaa28967a6814456423ad374d30d7f7c2 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 14 Jul 2008 07:26:13 +0000 Subject: [PATCH] Added WH_GETMESSAGE support. svn path=/trunk/; revision=34498 --- reactos/subsystems/win32/win32k/ntuser/hook.c | 2 +- reactos/subsystems/win32/win32k/ntuser/message.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 11ef68e8df5..65a6d362549 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -570,7 +570,7 @@ NtUserSetWindowsHookEx( /* We only (partially) support local WH_CBT hooks and * WH_KEYBOARD_LL/WH_MOUSE_LL hooks for now */ if ((WH_CBT != HookId || Global) - && WH_KEYBOARD_LL != HookId && WH_MOUSE_LL != HookId) + && WH_KEYBOARD_LL != HookId && WH_MOUSE_LL != HookId && WH_GETMESSAGE != HookId) { #if 0 /* Removed to get winEmbed working again */ UNIMPLEMENTED diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 7534ffd9c40..251af96489b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -856,6 +856,10 @@ NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, } Present = co_IntPeekMessage(&Msg, hWnd, MsgFilterMin, MsgFilterMax, RemoveMsg); + // The WH_GETMESSAGE hook enables an application to monitor messages about to + // be returned by the GetMessage or PeekMessage function. + co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)&Msg); + if (Present) { Info.Msg = Msg.Msg; @@ -1845,6 +1849,7 @@ NtUserMessageCall( { LRESULT lResult = 0; PWINDOW_OBJECT Window = NULL; + USER_REFERENCE_ENTRY Ref; UserEnterExclusive(); @@ -1852,15 +1857,15 @@ NtUserMessageCall( if (hWnd && (hWnd != INVALID_HANDLE_VALUE) && !(Window = UserGetWindowObject(hWnd))) { return 0; - } - + } + UserRefObjectCo(Window, &Ref); switch(dwType) { case NUMC_DEFWINDOWPROC: lResult = IntDefWindowProc(Window, Msg, wParam, lParam); break; } - + UserDerefObjectCo(Window); UserLeave(); return lResult; }