ReactOS 0.4.15-dev-7788-g1ad9096
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
11
12struct _test_info
13{
17};
18
19static 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
31static struct _test_info results[8];
32static int test_no = 0;
33
34
36{
37 results[test_no].ll_hook_called++;
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;
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",
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
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
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}
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:41
static HHOOK hMouseHook
Definition: SetCursorPos.c:10
void Test_DesktopAccess()
Definition: SetCursorPos.c:159
static HHOOK hMouseHookLL
Definition: SetCursorPos.c:10
#define TEST(s, x, y)
static int test_no
Definition: SetCursorPos.c:32
static struct _test_info results[8]
Definition: SetCursorPos.c:31
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:47
static HWND CreateTestWindow()
Definition: SetCursorPos.c:55
void Test_SetCursorPos()
Definition: SetCursorPos.c:90
LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam)
Definition: SetCursorPos.c:35
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SetLastError(x)
Definition: compat.h:752
#define CALLBACK
Definition: compat.h:35
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define assert(x)
Definition: debug.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
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
static HWND hWndTest
Definition: input.c:63
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
HBRUSH hbrBackground
Definition: winuser.h:3170
HICON hIcon
Definition: winuser.h:3168
HINSTANCE hInstance
Definition: winuser.h:3167
HCURSOR hCursor
Definition: winuser.h:3169
int cbWndExtra
Definition: winuser.h:3166
UINT style
Definition: winuser.h:3163
LPCSTR lpszMenuName
Definition: winuser.h:3171
LPCSTR lpszClassName
Definition: winuser.h:3172
WNDPROC lpfnWndProc
Definition: winuser.h:3164
int cbClsExtra
Definition: winuser.h:3165
int hook_called
Definition: SetCursorPos.c:15
int ll_hook_called
Definition: SetCursorPos.c:14
int mouse_move_called
Definition: SetCursorPos.c:16
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int ret
HDESK WINAPI CreateDesktopW(LPCWSTR lpszDesktop, LPCWSTR lpszDevice, LPDEVMODEW pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa)
Definition: desktop.c:473
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
HDESK WINAPI GetThreadDesktop(_In_ DWORD)
HWND WINAPI SetCapture(_In_ HWND hWnd)
#define CS_VREDRAW
Definition: winuser.h:658
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define SW_SHOWMAXIMIZED
Definition: winuser.h:773
void WINAPI mouse_event(_In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ ULONG_PTR)
#define COLOR_WINDOW
Definition: winuser.h:918
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define HWND_TOPMOST
Definition: winuser.h:1208
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4315
HHOOK WINAPI SetWindowsHookExW(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOMOVE
Definition: winuser.h:1244
#define CS_HREDRAW
Definition: winuser.h:653
BOOL WINAPI SetForegroundWindow(_In_ HWND)
#define IDC_ARROW
Definition: winuser.h:687
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2670
#define SWP_NOSIZE
Definition: winuser.h:1245
#define WM_MOUSEMOVE
Definition: winuser.h:1775
BOOL WINAPI SetCursorPos(_In_ int, _In_ int)
Definition: cursoricon.c:2662
#define SetWindowsHookEx
Definition: winuser.h:5856
#define IDI_APPLICATION
Definition: winuser.h:704
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1183
#define WH_MOUSE_LL
Definition: winuser.h:44
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
HWND WINAPI SetFocus(_In_opt_ HWND)
#define WH_MOUSE
Definition: winuser.h:37
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE hInstance, _In_ LPCSTR lpIconName)
Definition: cursoricon.c:2060
#define PM_REMOVE
Definition: winuser.h:1196
BOOL WINAPI UpdateWindow(_In_ HWND)
#define PeekMessage
Definition: winuser.h:5830
#define CW_USEDEFAULT
Definition: winuser.h:225
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyWindow(_In_ HWND)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2090