user/tests: Add test for low level mouse hooks.

Vitaliy Margolen wine-patch at kievinfo.com
Fri Jan 27 16:01:27 CST 2006


ChangeLog:
user/tests: Add test for low level mouse hooks.
All testes succeed. Just to be sure we don't brake this.

 dlls/user/tests/msg.c |   82 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 82 insertions(+), 0 deletions(-)
-------------- next part --------------
abaa46e1bdfb1c77726b5146b91f3f0009d6087b
diff --git a/dlls/user/tests/msg.c b/dlls/user/tests/msg.c
index 06bf40a..98e67e7 100644
--- a/dlls/user/tests/msg.c
+++ b/dlls/user/tests/msg.c
@@ -5659,6 +5659,13 @@ static const struct message WmGlobalHook
     { 0 }
 };
 
+static const struct message WmMouseLLHookSeq[] = {
+    { WM_MOUSEMOVE, hook },
+    { WM_LBUTTONDOWN, hook },
+    { WM_LBUTTONUP, hook },
+    { 0 }
+};
+
 static void CALLBACK win_event_global_hook_proc(HWINEVENTHOOK hevent,
 					 DWORD event,
 					 HWND hwnd,
@@ -5710,6 +5717,21 @@ static LRESULT CALLBACK cbt_global_hook_
 
 	return CallNextHookEx(hCBT_global_hook, nCode, wParam, lParam);
     }
+    /* WH_MOUSE_LL hook */
+    if (nCode == HC_ACTION)
+    {
+	struct message msg;
+        MSLLHOOKSTRUCT *mhll = (MSLLHOOKSTRUCT *)lParam;
+
+        /* we can't test for real mouse events */
+        if (mhll->flags & LLMHF_INJECTED)
+        {
+	    msg.message = wParam;
+            msg.flags = hook;
+	    add_message(&msg);
+        }
+	return CallNextHookEx(hCBT_global_hook, nCode, wParam, lParam);
+    }
 
     /* Log also SetFocus(0) calls */
     hwnd = wParam ? (HWND)wParam : (HWND)lParam;
@@ -5798,6 +5820,33 @@ static DWORD WINAPI cbt_global_hook_thre
     return 0;
 }
 
+static DWORD WINAPI mouse_ll_global_thread_proc(void *param)
+{
+    HWND hwnd;
+    MSG msg;
+    HANDLE hevent = *(HANDLE *)param;
+
+    hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 0,0,0,0,0,0,0, NULL);
+    assert(hwnd);
+    trace("created thread window %p\n", hwnd);
+
+    *(HWND *)param = hwnd;
+
+    flush_sequence();
+
+    mouse_event(MOUSEEVENTF_MOVE, 100, 0, 0, 0);
+    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
+    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
+
+    SetEvent(hevent);
+    while (GetMessage(&msg, 0, 0, 0))
+    {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
+    return 0;
+}
+
 static void test_winevents(void)
 {
     BOOL ret;
@@ -5960,6 +6009,39 @@ static void test_winevents(void)
     ok(!IsWindow(hwnd2), "window should be destroyed on thread exit\n");
     /****** end of out of context event test *************/
 
+    /****** start of MOUSE_LL hook test *************/
+    hCBT_global_hook = SetWindowsHookExA(WH_MOUSE_LL, cbt_global_hook_proc, GetModuleHandleA(0), 0);
+    assert(hCBT_global_hook);
+
+    hevent = CreateEventA(NULL, 0, 0, NULL);
+    assert(hevent);
+    hwnd2 = (HWND)hevent;
+
+    hthread = CreateThread(NULL, 0, mouse_ll_global_thread_proc, &hwnd2, 0, &tid);
+    ok(hthread != NULL, "CreateThread failed, error %ld\n", GetLastError());
+
+    while (WaitForSingleObject(hevent, 100) == WAIT_TIMEOUT)
+        while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+
+    ok_sequence(WmMouseLLHookSeq, "MOUSE_LL hook other thread", FALSE);
+    flush_sequence();
+
+    mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, 0);
+    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
+    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
+
+    ok_sequence(WmMouseLLHookSeq, "MOUSE_LL hook same thread", FALSE);
+
+    ret = UnhookWindowsHookEx(hCBT_global_hook);
+    ok( ret, "UnhookWindowsHookEx error %ld\n", GetLastError());
+
+    PostThreadMessageA(tid, WM_QUIT, 0, 0);
+    ok(WaitForSingleObject(hthread, INFINITE) == WAIT_OBJECT_0, "WaitForSingleObject failed\n");
+    CloseHandle(hthread);
+    CloseHandle(hevent);
+    ok(!IsWindow(hwnd2), "window should be destroyed on thread exit\n");
+    /****** end of MOUSE_LL hook test *************/
+
     ok(DestroyWindow(hwnd), "failed to destroy window\n");
 }
 


More information about the wine-patches mailing list