diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index dbbee3d96a8..1a7aa70f914 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -414,15 +414,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) CBT_CREATEWNDW CbtCreatewndw; CREATESTRUCTA Csa; CBT_CREATEWNDA CbtCreatewnda; - PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; - WPARAM wParam; - LPARAM lParam; + PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL; + WPARAM wParam = 0; + LPARAM lParam = 0; PKBDLLHOOKSTRUCT KeyboardLlData; PMSLLHOOKSTRUCT MouseLlData; PMSG Msg; PMOUSEHOOKSTRUCT MHook; PCWPSTRUCT CWP; PCWPRETSTRUCT CWPR; + PRECTL prl; + LPCBTACTIVATESTRUCT pcbtas; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; @@ -430,39 +432,59 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) { case WH_CBT: switch(Common->Code) - { + { case HCBT_CREATEWND: CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS) ((PCHAR) Common + Common->lParam); Csw = CbtCreatewndExtra->Cs; if (NULL != CbtCreatewndExtra->Cs.lpszName) - { + { Csw.lpszName = (LPCWSTR)((PCHAR) CbtCreatewndExtra + (ULONG) CbtCreatewndExtra->Cs.lpszName); - } + } if (0 != HIWORD(CbtCreatewndExtra->Cs.lpszClass)) - { + { Csw.lpszClass = (LPCWSTR)((PCHAR) CbtCreatewndExtra + LOWORD((ULONG) CbtCreatewndExtra->Cs.lpszClass)); - } + } wParam = Common->wParam; if (Common->Ansi) - { + { memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW)); CbtCreatewnda.lpcs = &Csa; CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; lParam = (LPARAM) &CbtCreatewnda; - } + } else - { + { CbtCreatewndw.lpcs = &Csw; CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; lParam = (LPARAM) &CbtCreatewndw; - } + } break; + case HCBT_CLICKSKIPPED: + MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) MHook; + break; + case HCBT_MOVESIZE: + prl = (PRECTL)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) prl; + break; + case HCBT_ACTIVATE: + pcbtas = (LPCBTACTIVATESTRUCT)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) pcbtas; + break; + case HCBT_KEYSKIPPED: + case HCBT_MINMAX: + case HCBT_SETFOCUS: + case HCBT_SYSCOMMAND: + case HCBT_DESTROYWND: + case HCBT_QS: + break; default: + ERR("HCBT_ not supported = %d\n", Common->Code); return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); - } + } if (Common->Proc) Result = Common->Proc(Common->Code, wParam, lParam); @@ -472,11 +494,11 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) } switch(Common->Code) - { + { case HCBT_CREATEWND: CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter; break; - } + } break; case WH_KEYBOARD_LL: KeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 94e712b7fb4..4fae54262f9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -391,6 +391,25 @@ co_IntCallHookProc(INT HookId, } } break; + + case HCBT_MOVESIZE: + ArgumentLength += sizeof(RECTL); + break; + case HCBT_ACTIVATE: + ArgumentLength += sizeof(CBTACTIVATESTRUCT); + break; + case HCBT_CLICKSKIPPED: + ArgumentLength += sizeof(MOUSEHOOKSTRUCT); + break; +/* ATM pass on */ + case HCBT_KEYSKIPPED: + case HCBT_MINMAX: + case HCBT_SETFOCUS: + case HCBT_SYSCOMMAND: +/* These types pass through. */ + case HCBT_DESTROYWND: + case HCBT_QS: + break; default: DPRINT1("Trying to call unsupported CBT hook %d\n", Code); return 0; @@ -481,6 +500,18 @@ co_IntCallHookProc(INT HookId, *((WCHAR *) Extra) = L'\0'; } break; + case HCBT_CLICKSKIPPED: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MOUSEHOOKSTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; + case HCBT_MOVESIZE: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(RECTL)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; + case HCBT_ACTIVATE: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CBTACTIVATESTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; } break; case WH_KEYBOARD_LL: diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 6b4e69659f4..faa8417ab67 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2430,13 +2430,10 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) IntDereferenceMessageQueue(Window->MessageQueue); /* Call hooks */ -#if 0 /* FIXME */ - - if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hwnd, 0, TRUE)) + if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) Window->hSelf, 0)) { return FALSE; } -#endif IntEngWindowChanged(Window, WOC_DELETE); isChild = (0 != (Wnd->Style & WS_CHILD));