2010/1/21 Lauri Kenttä lauri.kentta@gmail.com:
SetCursorPos should not call mouse low-level hooks.
dlls/user32/tests/input.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c index 7713ff6..a5dba06 100644 --- a/dlls/user32/tests/input.c +++ b/dlls/user32/tests/input.c @@ -1198,6 +1198,7 @@ static void test_keynames(void)
static POINT pt_old, pt_new; static BOOL clipped; +static int hook_proc2_call_times; #define STEP 3
static LRESULT CALLBACK hook_proc1( int code, WPARAM wparam, LPARAM lparam ) @@ -1231,6 +1232,8 @@ static LRESULT CALLBACK hook_proc2( int code, WPARAM wparam, LPARAM lparam ) MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam; POINT pt;
- ++hook_proc2_call_times;
if (code == HC_ACTION) { ok(hook->pt.x == pt_new.x && hook->pt.y == pt_new.y, @@ -1281,6 +1284,7 @@ static void test_mouse_ll_hook(void) HHOOK hook1, hook2; POINT pt_org, pt; RECT rc;
- int hook_proc2_call_times_old;
GetCursorPos(&pt_org); hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW | WS_VISIBLE, @@ -1347,6 +1351,18 @@ static void test_mouse_ll_hook(void) GetCursorPos(&pt); ok(pt.x == pt_new.x && pt.y == pt_new.y, "Position changed: (%d,%d)\n", pt.x, pt.y);
- /* Check that SetCursorPos doesn't call hooks.
- * Check twice: first moving to old coordinates, then to new. */
- SetCursorPos(10, 10);
- hook_proc2_call_times_old = hook_proc2_call_times;
- SetCursorPos(10, 10);
- ok(hook_proc2_call_times_old == hook_proc2_call_times, "Hooks called\n");
- hook_proc2_call_times_old = hook_proc2_call_times;
- SetCursorPos(20, 20);
- ok(hook_proc2_call_times_old == hook_proc2_call_times, "Hooks called\n");
UnhookWindowsHookEx(hook2); done: DestroyWindow(hwnd); -- 1.6.6
Hi Lauri,
What about resetting hook_proc2_call_times to 0 before calling SetCursorPos and just checking if it has changed ? Also other static variables used in hook procs aren't prefixed, this is more trivial but everyone is encouraged to follow current code style of the file.