1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for SetCursorPos 5 * PROGRAMMERS: Giannis Adamopoulos 6 */ 7 8 #include "precomp.h" 9 10 static HHOOK hMouseHookLL, hMouseHook; 11 12 struct _test_info 13 { 14 int ll_hook_called; 15 int hook_called; 16 int mouse_move_called; 17 }; 18 19 static struct _test_info info[] = 20 { 21 {0,0,0}, /* SetCursorPos without a window */ 22 {1,1,0}, /* mouse_event without a window */ 23 {0,1,1}, /* SetCursorPos with a window */ 24 {1,1,1}, /* mouse_event with a window */ 25 {0,1,1}, /* multiple SetCursorPos with a window with coalescing */ 26 {0,2,2}, /* multiple SetCursorPos with a window without coalescing */ 27 {2,1,1}, /* multiple mouse_event with a window with coalescing */ 28 {2,2,2}, /* multiple mouse_event with a window without coalescing */ 29 }; 30 31 static struct _test_info results[8]; 32 static int test_no = 0; 33 34 35 LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam) 36 { 37 results[test_no].ll_hook_called++; 38 return CallNextHookEx(hMouseHookLL, nCode, wParam, lParam); 39 } 40 41 LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) 42 { 43 results[test_no].hook_called++; 44 return CallNextHookEx(hMouseHook, nCode, wParam, lParam); 45 } 46 47 static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) 48 { 49 if(msg == WM_MOUSEMOVE) 50 results[test_no].mouse_move_called++; 51 52 return DefWindowProcA( hWnd, msg, wParam, lParam ); 53 } 54 55 static HWND CreateTestWindow() 56 { 57 MSG msg; 58 WNDCLASSA wclass; 59 HANDLE hInstance = GetModuleHandleA( NULL ); 60 HWND hWndTest; 61 62 wclass.lpszClassName = "MouseInputTestClass"; 63 wclass.style = CS_HREDRAW | CS_VREDRAW; 64 wclass.lpfnWndProc = WndProc; 65 wclass.hInstance = hInstance; 66 wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); 67 wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); 68 wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); 69 wclass.lpszMenuName = 0; 70 wclass.cbClsExtra = 0; 71 wclass.cbWndExtra = 0; 72 RegisterClassA( &wclass ); 73 /* create the test window that will receive the keystrokes */ 74 hWndTest = CreateWindowA( wclass.lpszClassName, "MouseInputTestTest", 75 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, 76 NULL, NULL, hInstance, NULL); 77 assert( hWndTest ); 78 ShowWindow( hWndTest, SW_SHOWMAXIMIZED); 79 SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); 80 SetForegroundWindow( hWndTest ); 81 UpdateWindow( hWndTest); 82 SetFocus(hWndTest); 83 84 /* flush pending messages */ 85 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 86 87 return hWndTest; 88 } 89 90 void Test_SetCursorPos() 91 { 92 HWND hwnd; 93 MSG msg; 94 int i; 95 96 hMouseHookLL = SetWindowsHookEx(WH_MOUSE_LL, MouseLLHookProc, GetModuleHandleA( NULL ), 0); 97 hMouseHook = SetWindowsHookExW(WH_MOUSE, MouseHookProc, GetModuleHandleW( NULL ), GetCurrentThreadId()); 98 ok(hMouseHook!=NULL,"failed to set hook\n"); 99 ok(hMouseHookLL!=NULL,"failed to set hook\n"); 100 101 test_no = 0; 102 SetCursorPos(1,1); 103 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 104 105 test_no = 1; 106 mouse_event(MOUSEEVENTF_MOVE, 2,2, 0,0); 107 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 108 109 hwnd = CreateTestWindow(); 110 SetCapture(hwnd); 111 112 test_no = 2; 113 SetCursorPos(50,50); 114 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 115 116 test_no = 3; 117 mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); 118 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 119 120 test_no = 4; 121 SetCursorPos(50,50); 122 SetCursorPos(60,60); 123 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 124 125 test_no = 5; 126 SetCursorPos(50,50); 127 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 128 SetCursorPos(60,60); 129 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 130 131 test_no = 6; 132 mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); 133 mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); 134 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 135 136 test_no = 7; 137 mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); 138 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 139 mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); 140 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); 141 142 for(i = 0; i< 8; i++) 143 { 144 #define TEST(s,x,y) ok(y == x, "%d: %s called %d times instead of %d\n",i,s, y,x); 145 TEST("WH_MOUSE_LL", info[i].ll_hook_called, results[i].ll_hook_called); 146 /* WH_MOUSE results vary greatly among windows versions */ 147 //TEST("WH_MOUSE", info[i].hook_called, results[i].hook_called); 148 //TEST("WM_MOUSEMOVE", info[i].mouse_move_called, results[i].mouse_move_called); 149 } 150 151 SetCapture(NULL); 152 DestroyWindow(hwnd); 153 154 UnhookWindowsHookEx (hMouseHook); 155 UnhookWindowsHookEx (hMouseHookLL); 156 157 } 158 159 void Test_DesktopAccess() 160 { 161 HDESK hDesk, hDeskInitial; 162 POINT curPoint, initialPoint; 163 BOOL ret; 164 165 hDeskInitial = GetThreadDesktop(GetCurrentThreadId()); 166 ok(hDeskInitial != NULL, "Failed to retrieve the initial desktop\n"); 167 168 ret = GetCursorPos(&initialPoint); 169 ok(ret == TRUE, "GetCursorPos should succed\n"); 170 171 hDesk = CreateDesktopW(L"testDesktop", NULL, NULL, 0, 0x01ff, NULL); 172 ok(hDesk != 0, "Failed to create a new desktop\n"); 173 SetThreadDesktop(hDesk); 174 ok(GetThreadDesktop(GetCurrentThreadId()) == hDesk, "SetThreadDesktop had no effect\n"); 175 176 SetLastError(0xdeadbeef); 177 178 ret = GetCursorPos(&curPoint); 179 ok(ret == FALSE, "GetCursorPos should fail\n"); 180 181 ok(GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == 0xdeadbeef, 182 "Expected ERROR_ACCESS_DENIED or 0xdeadbeef, got 0x%lx\n", GetLastError()); 183 SetLastError(0xdeadbeef); 184 185 ret = SetCursorPos(2,2); 186 //ok(ret == FALSE, "SetCursorPos should fail\n"); // FIXME: fails on WHS testbot 187 188 ok(GetLastError() == 0xdeadbeef, "Wrong last error, got 0x%lx\n", GetLastError()); 189 190 ret = GetCursorPos(&curPoint); 191 ok(ret == FALSE, "GetCursorPos should fail\n"); 192 193 SetThreadDesktop(hDeskInitial); 194 195 ret = GetCursorPos(&curPoint); 196 ok(ret == TRUE, "GetCursorPos should succed\n"); 197 //ok(curPoint.x == initialPoint.x && curPoint.y == initialPoint.y, "Mouse position changed\n"); 198 } 199 200 START_TEST(SetCursorPos) 201 { 202 Test_DesktopAccess(); 203 Test_SetCursorPos(); 204 } 205