ReactOS  0.4.15-dev-5112-g22d8c0f
SetCursorPos.c
Go to the documentation of this file.
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 {
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 
36 {
37  results[test_no].ll_hook_called++;
38  return CallNextHookEx(hMouseHookLL, nCode, wParam, lParam);
39 }
40 
42 {
43  results[test_no].hook_called++;
44  return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
45 }
46 
48 {
49  if(msg == WM_MOUSEMOVE)
50  results[test_no].mouse_move_called++;
51 
52  return DefWindowProcA( hWnd, msg, wParam, lParam );
53 }
54 
56 {
57  MSG msg;
58  WNDCLASSA wclass;
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 );
83 
84  /* flush pending messages */
85  while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
86 
87  return hWndTest;
88 }
89 
91 {
92  HWND hwnd;
93  MSG msg;
94  int i;
95 
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 
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);
153 
156 
157 }
158 
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 
201 {
204 }
static int test_no
Definition: SetCursorPos.c:32
#define WH_MOUSE
Definition: winuser.h:37
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define PeekMessage
Definition: winuser.h:5820
static HHOOK hMouseHookLL
Definition: SetCursorPos.c:10
#define TRUE
Definition: types.h:120
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
int mouse_move_called
Definition: SetCursorPos.c:16
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI UpdateWindow(_In_ HWND)
HWND hWnd
Definition: settings.c:17
HDESK WINAPI GetThreadDesktop(_In_ DWORD)
int cbClsExtra
Definition: winuser.h:3155
#define assert(x)
Definition: debug.h:53
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
#define CS_HREDRAW
Definition: winuser.h:648
LPCSTR lpszMenuName
Definition: winuser.h:3161
#define HWND_TOPMOST
Definition: winuser.h:1198
HWND WINAPI SetFocus(_In_opt_ HWND)
#define IDI_APPLICATION
Definition: winuser.h:699
UINT_PTR WPARAM
Definition: windef.h:207
HBRUSH hbrBackground
Definition: winuser.h:3160
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2639
BOOL WINAPI DestroyWindow(_In_ HWND)
#define COLOR_WINDOW
Definition: winuser.h:912
LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:35
WPARAM wParam
Definition: combotst.c:138
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2029
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
#define WH_MOUSE_LL
Definition: winuser.h:44
int cbWndExtra
Definition: winuser.h:3156
HINSTANCE hInstance
Definition: charmap.c:20
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
unsigned int BOOL
Definition: ntddk_ex.h:94
int ll_hook_called
Definition: SetCursorPos.c:14
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4305
START_TEST(SetCursorPos)
Definition: SetCursorPos.c:200
HCURSOR hCursor
Definition: winuser.h:3159
#define CW_USEDEFAULT
Definition: winuser.h:225
void WINAPI mouse_event(_In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ ULONG_PTR)
LONG_PTR LPARAM
Definition: windef.h:208
DWORD WINAPI GetCurrentThreadId(VOID)
Definition: thread.c:459
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:41
static HWND hWndTest
Definition: input.c:63
#define CS_VREDRAW
Definition: winuser.h:653
BOOL WINAPI SetCursorPos(_In_ int, _In_ int)
Definition: cursoricon.c:2631
#define SetWindowsHookEx
Definition: winuser.h:5846
void Test_SetCursorPos()
Definition: SetCursorPos.c:90
#define SetLastError(x)
Definition: compat.h:611
static struct _test_info results[8]
Definition: SetCursorPos.c:31
int ret
static HHOOK hMouseHook
Definition: SetCursorPos.c:10
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define TEST(s, x, y)
LPCSTR lpszClassName
Definition: winuser.h:3162
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:47
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2059
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
UINT style
Definition: winuser.h:3153
#define SWP_NOSIZE
Definition: winuser.h:1235
HWND WINAPI SetCapture(_In_ HWND hWnd)
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: winuser.h:3157
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1173
#define ok(value,...)
Definition: atltest.h:57
unsigned int UINT
Definition: ndis.h:50
#define WM_MOUSEMOVE
Definition: winuser.h:1765
#define NULL
Definition: types.h:112
int hook_called
Definition: SetCursorPos.c:15
WNDPROC lpfnWndProc
Definition: winuser.h:3154
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
HHOOK WINAPI SetWindowsHookExW(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD)
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
static HWND CreateTestWindow()
Definition: SetCursorPos.c:55
void Test_DesktopAccess()
Definition: SetCursorPos.c:159
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
BOOL WINAPI SetForegroundWindow(_In_ HWND)
#define SWP_NOMOVE
Definition: winuser.h:1234
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1186
HDESK WINAPI CreateDesktopW(LPCWSTR lpszDesktop, LPCWSTR lpszDevice, LPDEVMODEW pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
Definition: desktop.c:473
LONG_PTR LRESULT
Definition: windef.h:209
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
LPARAM lParam
Definition: combotst.c:139
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
HICON hIcon
Definition: winuser.h:3158