ReactOS 0.4.16-dev-340-g0540c21
mouse.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Mouse functions
5 * FILE: win32ss/user/ntuser/mouse.c
6 * PROGRAMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Rafal Harabien (rafalh@reactos.org)
8 */
9
10#include <win32k.h>
12
13MOUSEMOVEPOINT gMouseHistoryOfMoves[64];
15
16/*
17 * UserGetMouseButtonsState
18 *
19 * Returns bitfield of MK_* flags used in mouse messages
20 */
23{
24 WORD wRet = 0;
25
27
30
31 return wRet;
32}
33
34/*
35 * UserProcessMouseInput
36 *
37 * Process raw mouse input data
38 */
41{
43
44 /* Convert MOUSE_INPUT_DATA to MOUSEINPUT. First init all fields. */
45 mi.dx = mid->LastX;
46 mi.dy = mid->LastY;
47 mi.mouseData = 0;
48 mi.dwFlags = 0;
49 mi.time = 0;
50 mi.dwExtraInfo = mid->ExtraInformation;
51
52 /* Mouse position */
53 if (mi.dx != 0 || mi.dy != 0)
55
56 /* Flags for absolute move */
57 if (mid->Flags & MOUSE_MOVE_ABSOLUTE)
61
62 /* Left button */
67
68 /* Middle button */
73
74 /* Right button */
79
80 /* Note: Next buttons use mouseData field so they cannot be sent in one call */
81
82 /* Button 4 */
84 {
86 mi.mouseData |= XBUTTON1;
87 }
89 {
91 mi.mouseData |= XBUTTON1;
92 }
93
94 /* If mouseData is used by button 4, send input and clear mi */
96 {
98 RtlZeroMemory(&mi, sizeof(mi));
99 }
100
101 /* Button 5 */
103 {
104 mi.mouseData |= XBUTTON2;
106 }
108 {
109 mi.mouseData |= XBUTTON2;
111 }
112
113 /* If mouseData is used by button 5, send input and clear mi */
115 {
117 RtlZeroMemory(&mi, sizeof(mi));
118 }
119
120 /* Mouse wheel */
121 if (mid->ButtonFlags & MOUSE_WHEEL)
122 {
123 mi.mouseData = mid->ButtonData;
125 }
126
127 /* If something has changed, send input to user */
128 if (mi.dwFlags)
130}
131
132/*
133 * IntFixMouseInputButtons
134 *
135 * Helper function for supporting mouse button swap function
136 */
137DWORD
139{
140 DWORD dwNewFlags;
141
142 if (!gspv.bMouseBtnSwap)
143 return dwFlags;
144
145 /* Buttons other than left and right are not affected */
148
149 /* Swap buttons */
151 dwNewFlags |= MOUSEEVENTF_RIGHTDOWN;
153 dwNewFlags |= MOUSEEVENTF_RIGHTUP;
155 dwNewFlags |= MOUSEEVENTF_LEFTDOWN;
157 dwNewFlags |= MOUSEEVENTF_LEFTUP;
158
159 return dwNewFlags;
160}
161
162/*
163 * UserSendMouseInput
164 *
165 * Process mouse input from input devices and SendInput API
166 */
169{
170 POINT ptCursor;
171 PSYSTEM_CURSORINFO pCurInfo;
172 MSG Msg;
174
175 ASSERT(pmi);
176
177 pCurInfo = IntGetSysCursorInfo();
178 ptCursor = gpsi->ptCursor;
180
182
183 if (pmi->dwFlags & MOUSEEVENTF_MOVE)
184 {
185 /* Mouse has changes position */
186 if (!(pmi->dwFlags & MOUSEEVENTF_ABSOLUTE))
187 {
188 /* Relative move */
189 ptCursor.x += pmi->dx;
190 ptCursor.y += pmi->dy;
191 }
192 else if (pmi->dwFlags & MOUSEEVENTF_VIRTUALDESK)
193 {
194 /* Absolute move in virtual screen units */
195 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXVIRTUALSCREEN) >> 16;
196 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYVIRTUALSCREEN) >> 16;
197 }
198 else
199 {
200 /* Absolute move in primary monitor units */
201 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXSCREEN) >> 16;
202 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYSCREEN) >> 16;
203 }
204 }
205
206 /* Init message fields */
207 Msg.wParam = UserGetMouseButtonsState();
208 Msg.lParam = MAKELPARAM(ptCursor.x, ptCursor.y);
209 Msg.pt = ptCursor;
210 Msg.time = pmi->time;
211 if (!Msg.time)
212 {
213 Msg.time = EngGetTickCount32();
214 }
215
216 /* Do GetMouseMovePointsEx FIFO. */
222 gcMouseHistoryOfMoves = 0; // 0 - 63 is 64, FIFO forwards.
223
224 /* Update cursor position */
226 {
227 UserSetCursorPos(ptCursor.x, ptCursor.y, bInjected, pmi->dwExtraInfo, TRUE);
228 }
229
231 pCurInfo->ButtonsDown |= MK_SHIFT;
232 else
233 pCurInfo->ButtonsDown &= ~MK_SHIFT;
234
236 pCurInfo->ButtonsDown |= MK_CONTROL;
237 else
238 pCurInfo->ButtonsDown &= ~MK_CONTROL;
239
240 /* Left button */
242 {
244 Msg.message = WM_LBUTTONDOWN;
245 pCurInfo->ButtonsDown |= MK_LBUTTON;
246 Msg.wParam |= MK_LBUTTON;
247 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
248 }
249 else if (dwFlags & MOUSEEVENTF_LEFTUP)
250 {
252 Msg.message = WM_LBUTTONUP;
253 pCurInfo->ButtonsDown &= ~MK_LBUTTON;
254 Msg.wParam &= ~MK_LBUTTON;
255 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
256 }
257
258 /* Middle button */
260 {
262 Msg.message = WM_MBUTTONDOWN;
263 pCurInfo->ButtonsDown |= MK_MBUTTON;
264 Msg.wParam |= MK_MBUTTON;
265 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
266 }
267 else if (dwFlags & MOUSEEVENTF_MIDDLEUP)
268 {
270 Msg.message = WM_MBUTTONUP;
271 pCurInfo->ButtonsDown &= ~MK_MBUTTON;
272 Msg.wParam &= ~MK_MBUTTON;
273 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
274 }
275
276 /* Right button */
278 {
280 Msg.message = WM_RBUTTONDOWN;
281 pCurInfo->ButtonsDown |= MK_RBUTTON;
282 Msg.wParam |= MK_RBUTTON;
283 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
284 }
285 else if (dwFlags & MOUSEEVENTF_RIGHTUP)
286 {
288 Msg.message = WM_RBUTTONUP;
289 pCurInfo->ButtonsDown &= ~MK_RBUTTON;
290 Msg.wParam &= ~MK_RBUTTON;
291 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
292 }
293
296 {
297 /* Fail because both types of events use the mouseData field */
298 WARN("Invalid flags!\n");
299 return FALSE;
300 }
301
302 /* X-Button (4 or 5) */
304 {
305 Msg.message = WM_XBUTTONDOWN;
306 if (pmi->mouseData & XBUTTON1)
307 {
308 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, TRUE);
309 pCurInfo->ButtonsDown |= MK_XBUTTON1;
310 Msg.wParam |= MAKEWPARAM(MK_XBUTTON1, XBUTTON1);
311 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
312 }
313 if (pmi->mouseData & XBUTTON2)
314 {
315 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, TRUE);
316 pCurInfo->ButtonsDown |= MK_XBUTTON2;
317 Msg.wParam |= MAKEWPARAM(MK_XBUTTON2, XBUTTON2);
318 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
319 }
320 }
321 else if (dwFlags & MOUSEEVENTF_XUP)
322 {
323 Msg.message = WM_XBUTTONUP;
324 if(pmi->mouseData & XBUTTON1)
325 {
326 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, FALSE);
327 pCurInfo->ButtonsDown &= ~MK_XBUTTON1;
328 Msg.wParam &= ~MK_XBUTTON1;
329 Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
330 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
331 }
332 if (pmi->mouseData & XBUTTON2)
333 {
334 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, FALSE);
335 pCurInfo->ButtonsDown &= ~MK_XBUTTON2;
336 Msg.wParam &= ~MK_XBUTTON2;
337 Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
338 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
339 }
340 }
341
342 /* Mouse wheel */
344 {
345 Msg.message = WM_MOUSEWHEEL;
346 Msg.wParam = MAKEWPARAM(pCurInfo->ButtonsDown, pmi->mouseData);
347 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
348 }
349
350 return TRUE;
351}
352
353VOID
356 PDESKTOP pDesk)
357{
358 /* Generate a leave message */
359 if (pDesk->dwDTFlags & DF_TME_LEAVE)
360 {
361 UINT uMsg = (pDesk->htEx != HTCLIENT) ? WM_NCMOUSELEAVE : WM_MOUSELEAVE;
362 UserPostMessage(UserHMGetHandle(pDesk->spwndTrack), uMsg, 0, 0);
363 }
364 /* Kill the timer */
365 if (pDesk->dwDTFlags & DF_TME_HOVER)
367
368 /* Reset state */
370 pDesk->spwndTrack = NULL;
371}
372
373BOOL
376 LPTRACKMOUSEEVENT lpEventTrack)
377{
378 PDESKTOP pDesk;
379 PTHREADINFO pti;
380
382 pDesk = pti->rpdesk;
383
384 /* Always cleared with size set and return true. */
385 RtlZeroMemory(lpEventTrack , sizeof(TRACKMOUSEEVENT));
386 lpEventTrack->cbSize = sizeof(TRACKMOUSEEVENT);
387
388 if (pDesk->dwDTFlags & (DF_TME_LEAVE | DF_TME_HOVER) &&
389 pDesk->spwndTrack &&
390 pti->MessageQueue == pDesk->spwndTrack->head.pti->MessageQueue)
391 {
392 if (pDesk->htEx != HTCLIENT)
393 lpEventTrack->dwFlags |= TME_NONCLIENT;
394
395 if (pDesk->dwDTFlags & DF_TME_LEAVE)
396 lpEventTrack->dwFlags |= TME_LEAVE;
397
398 if (pDesk->dwDTFlags & DF_TME_HOVER)
399 {
400 lpEventTrack->dwFlags |= TME_HOVER;
401 lpEventTrack->dwHoverTime = pDesk->dwMouseHoverTime;
402 }
403 lpEventTrack->hwndTrack = UserHMGetHandle(pDesk->spwndTrack);
404 }
405 return TRUE;
406}
407
408BOOL
411 LPTRACKMOUSEEVENT lpEventTrack)
412{
413 PDESKTOP pDesk;
414 PTHREADINFO pti;
415 PWND pWnd;
416 POINT point;
417
419 pDesk = pti->rpdesk;
420
421 if (!(pWnd = UserGetWindowObject(lpEventTrack->hwndTrack)))
422 return FALSE;
423
424 if ( pDesk->spwndTrack != pWnd ||
425 (pDesk->htEx != HTCLIENT) ^ !!(lpEventTrack->dwFlags & TME_NONCLIENT) )
426 {
427 if ( lpEventTrack->dwFlags & TME_LEAVE && !(lpEventTrack->dwFlags & TME_CANCEL) )
428 {
429 UserPostMessage( lpEventTrack->hwndTrack,
431 0, 0);
432 }
433 TRACE("IntTrackMouseEvent spwndTrack %p pwnd %p\n", pDesk->spwndTrack, pWnd);
434 return TRUE;
435 }
436
437 /* Tracking spwndTrack same as pWnd */
438 if (lpEventTrack->dwFlags & TME_CANCEL) // Canceled mode.
439 {
440 if (lpEventTrack->dwFlags & TME_LEAVE)
441 pDesk->dwDTFlags &= ~DF_TME_LEAVE;
442
443 if (lpEventTrack->dwFlags & TME_HOVER)
444 {
445 if (pDesk->dwDTFlags & DF_TME_HOVER)
446 { // Kill hover timer.
448 pDesk->dwDTFlags &= ~DF_TME_HOVER;
449 }
450 }
451 }
452 else // Not Canceled.
453 {
454 if (lpEventTrack->dwFlags & TME_LEAVE)
455 pDesk->dwDTFlags |= DF_TME_LEAVE;
456
457 if (lpEventTrack->dwFlags & TME_HOVER)
458 {
459 pDesk->dwDTFlags |= DF_TME_HOVER;
460
461 if (!lpEventTrack->dwHoverTime || lpEventTrack->dwHoverTime == HOVER_DEFAULT)
462 pDesk->dwMouseHoverTime = gspv.iMouseHoverTime; // use the system default hover time-out.
463 else
464 pDesk->dwMouseHoverTime = lpEventTrack->dwHoverTime;
465 // Start timer for the hover period.
467 // Get windows thread message points.
468 point = pWnd->head.pti->ptLast;
469 // Set desktop mouse hover from the system default hover rectangle.
475 }
476 }
477 return TRUE;
478}
479
480BOOL
483 LPTRACKMOUSEEVENT lpEventTrack)
484{
485 TRACKMOUSEEVENT SafeTME;
486 BOOL bRet = FALSE;
487
488 TRACE("Enter NtUserTrackMouseEvent\n");
489
491 {
492 ProbeForRead(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1);
493 RtlCopyMemory(&SafeTME, lpEventTrack, sizeof(TRACKMOUSEEVENT));
494 }
496 {
498 _SEH2_YIELD(return FALSE);
499 }
500 _SEH2_END;
501
502 if (SafeTME.cbSize != sizeof(TRACKMOUSEEVENT))
503 {
505 return FALSE;
506 }
507
509 {
511 return FALSE;
512 }
513
515
516 if (SafeTME.dwFlags & TME_QUERY)
517 {
518 bRet = IntQueryTrackMouseEvent(&SafeTME);
520 {
521 ProbeForWrite(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1);
522 RtlCopyMemory(lpEventTrack, &SafeTME, sizeof(TRACKMOUSEEVENT));
523 }
525 {
527 bRet = FALSE;
528 }
529 _SEH2_END;
530 }
531 else
532 {
533 bRet = IntTrackMouseEvent(&SafeTME);
534 }
535
536 TRACE("Leave NtUserTrackMouseEvent, ret=%i\n", bRet);
537 UserLeave();
538 return bRet;
539}
540
541DWORD
544 UINT cbSize,
545 LPMOUSEMOVEPOINT lpptIn,
546 LPMOUSEMOVEPOINT lpptOut,
547 int nBufPoints,
548 DWORD resolution)
549{
550 MOUSEMOVEPOINT Safeppt;
551 //BOOL Hit;
552 INT iRet = -1;
553
554 TRACE("Enter NtUserGetMouseMovePointsEx\n");
555
556 if ((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64))
557 {
559 return (DWORD)-1;
560 }
561
562 if (!lpptIn || (!lpptOut && nBufPoints))
563 {
565 return (DWORD)-1;
566 }
567
569 {
570 ProbeForRead(lpptIn, cbSize, 1);
571 RtlCopyMemory(&Safeppt, lpptIn, cbSize);
572 }
574 {
576 _SEH2_YIELD(return (DWORD)-1);
577 }
578 _SEH2_END;
579
581
582 // http://msdn.microsoft.com/en-us/library/ms646259(v=vs.85).aspx
583 // This explains the math issues in transforming points.
584 iRet = gcMouseHistoryOfMoves; // FIFO is forward so retrieve backward.
585 //Hit = FALSE;
586 do
587 {
588 if (Safeppt.x == 0 && Safeppt.y == 0)
589 break; // No test.
590 // Finds the point, it returns the last nBufPoints prior to and including the supplied point.
591 if (gMouseHistoryOfMoves[iRet].x == Safeppt.x && gMouseHistoryOfMoves[iRet].y == Safeppt.y)
592 {
593 if (Safeppt.time) // Now test time and it seems to be absolute.
594 {
595 if (Safeppt.time == gMouseHistoryOfMoves[iRet].time)
596 {
597 //Hit = TRUE;
598 break;
599 }
600 else
601 {
602 if (--iRet < 0) iRet = 63;
603 continue;
604 }
605 }
606 //Hit = TRUE;
607 break;
608 }
609 if (--iRet < 0) iRet = 63;
610 }
611 while (iRet != gcMouseHistoryOfMoves);
612
613 switch(resolution)
614 {
615 case GMMP_USE_DISPLAY_POINTS:
616 if (nBufPoints)
617 {
619 {
620 ProbeForWrite(lpptOut, cbSize, 1);
621 }
623 {
625 iRet = -1;
626 _SEH2_YIELD(goto cleanup);
627 }
628 _SEH2_END;
629 }
630 iRet = nBufPoints;
631 break;
632 case GMMP_USE_HIGH_RESOLUTION_POINTS:
633 break;
634 default:
636 iRet = -1;
637 }
638
639cleanup:
640 TRACE("Leave NtUserGetMouseMovePointsEx, ret=%i\n", iRet);
641 UserLeave();
642 return (DWORD)iRet;
643}
#define WARN(fmt,...)
Definition: precomp.h:61
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
struct @1642 Msg[]
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
PSERVERINFO gpsi
Definition: imm.c:18
static void cleanup(void)
Definition: main.c:1335
POINTL point
Definition: edittest.c:50
#define EngGetTickCount32()
Definition: eng.h:43
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define ASSERT(a)
Definition: mode.c:44
static POINTER_INPUT_TYPE *static LPMOUSEMOVEPOINT
Definition: input.c:84
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
unsigned int UINT
Definition: ndis.h:50
#define FASTCALL
Definition: nt_native.h:50
#define MOUSE_LEFT_BUTTON_DOWN
Definition: ntddmou.h:46
#define MOUSE_LEFT_BUTTON_UP
Definition: ntddmou.h:47
#define MOUSE_MIDDLE_BUTTON_DOWN
Definition: ntddmou.h:50
#define MOUSE_BUTTON_4_DOWN
Definition: ntddmou.h:52
#define MOUSE_BUTTON_5_UP
Definition: ntddmou.h:55
#define MOUSE_WHEEL
Definition: ntddmou.h:56
#define MOUSE_MOVE_ABSOLUTE
Definition: ntddmou.h:68
#define MOUSE_VIRTUAL_DESKTOP
Definition: ntddmou.h:69
#define MOUSE_BUTTON_5_DOWN
Definition: ntddmou.h:54
#define MOUSE_BUTTON_4_UP
Definition: ntddmou.h:53
#define MOUSE_RIGHT_BUTTON_UP
Definition: ntddmou.h:49
#define MOUSE_MIDDLE_BUTTON_UP
Definition: ntddmou.h:51
#define MOUSE_RIGHT_BUTTON_DOWN
Definition: ntddmou.h:48
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:242
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
#define TME_CANCEL
Definition: commctrl.h:4989
#define TME_LEAVE
Definition: commctrl.h:4986
#define HOVER_DEFAULT
Definition: commctrl.h:4991
#define WM_MOUSELEAVE
Definition: commctrl.h:4980
#define TME_NONCLIENT
Definition: commctrl.h:4987
struct tagTRACKMOUSEEVENT TRACKMOUSEEVENT
#define TME_QUERY
Definition: commctrl.h:4988
#define TME_HOVER
Definition: commctrl.h:4985
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_END
Definition: pseh2_64.h:155
#define _SEH2_TRY
Definition: pseh2_64.h:55
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwMouseHoverTime
Definition: desktop.h:34
PWND spwndTrack
Definition: desktop.h:31
DWORD htEx
Definition: desktop.h:32
RECT rcMouseHover
Definition: desktop.h:33
DWORD dwDTFlags
Definition: desktop.h:12
USHORT ButtonData
Definition: ntddmou.h:83
USHORT ButtonFlags
Definition: ntddmou.h:82
USHORT Flags
Definition: ntddmou.h:78
ULONG ExtraInformation
Definition: ntddmou.h:89
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
INT iMouseHoverWidth
Definition: sysparams.h:85
BOOL bMouseBtnSwap
Definition: sysparams.h:82
INT iMouseHoverHeight
Definition: sysparams.h:86
INT iMouseHoverTime
Definition: sysparams.h:87
struct _DESKTOP * rpdesk
Definition: win32.h:92
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
Definition: ntuser.h:694
THRDESKHEAD head
Definition: ntuser.h:695
DWORD dwFlags
Definition: winuser.h:3790
DWORD time
Definition: winable.h:43
ULONG_PTR dwExtraInfo
Definition: winable.h:44
DWORD mouseData
Definition: winable.h:41
DWORD dwFlags
Definition: winable.h:42
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define WM_MOUSEWHEEL
Definition: treelist.c:96
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define NTAPI
Definition: typedefs.h:36
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:124
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
#define DF_TME_LEAVE
Definition: desktop.h:48
#define DF_TME_HOVER
Definition: desktop.h:47
#define SET_KEY_DOWN(ks, vk, down)
Definition: input.h:100
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:98
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1395
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:214
BOOL FASTCALL IntTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:410
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:138
DWORD APIENTRY NtUserGetMouseMovePointsEx(UINT cbSize, LPMOUSEMOVEPOINT lpptIn, LPMOUSEMOVEPOINT lpptOut, int nBufPoints, DWORD resolution)
Definition: mouse.c:543
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:168
VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA mid)
Definition: mouse.c:40
BOOL APIENTRY NtUserTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:482
BOOL FASTCALL IntQueryTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:375
VOID FASTCALL IntRemoveTrackMouseEvent(PDESKTOP pDesk)
Definition: mouse.c:355
INT gcMouseHistoryOfMoves
Definition: mouse.c:14
SPIVALUES gspv
Definition: sysparams.c:17
VOID CALLBACK SystemTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: timer.c:286
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:579
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:182
#define TMRF_SYSTEM
Definition: timer.h:20
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27
static MONITORINFO mi
Definition: win.c:7338
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
#define ERROR_POINT_NOT_FOUND
Definition: winerror.h:693
#define ERROR_INVALID_FLAGS
Definition: winerror.h:583
#define ERROR_NOACCESS
Definition: winerror.h:578
#define MK_RBUTTON
Definition: winuser.h:2371
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1197
#define MAKEWPARAM(l, h)
Definition: winuser.h:4012
#define MK_SHIFT
Definition: winuser.h:2372
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1042
#define MAKELPARAM(l, h)
Definition: winuser.h:4011
#define SM_CYSCREEN
Definition: winuser.h:963
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1188
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1195
#define VK_RBUTTON
Definition: winuser.h:2194
#define VK_CONTROL
Definition: winuser.h:2206
#define WM_RBUTTONUP
Definition: winuser.h:1783
#define VK_MBUTTON
Definition: winuser.h:2196
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1190
#define WM_LBUTTONDOWN
Definition: winuser.h:1779
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1192
#define MOUSEEVENTF_XUP
Definition: winuser.h:1194
#define WM_RBUTTONDOWN
Definition: winuser.h:1782
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1041
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1186
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1187
#define MK_MBUTTON
Definition: winuser.h:2374
#define MK_CONTROL
Definition: winuser.h:2373
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1193
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1196
#define HTCLIENT
Definition: winuser.h:2478
#define WM_LBUTTONUP
Definition: winuser.h:1780
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1189
#define MK_LBUTTON
Definition: winuser.h:2370
#define VK_SHIFT
Definition: winuser.h:2205
#define SM_CXSCREEN
Definition: winuser.h:962
#define WM_NCMOUSELEAVE
Definition: winuser.h:1845
#define WM_MBUTTONUP
Definition: winuser.h:1786
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1191
#define WM_MBUTTONDOWN
Definition: winuser.h:1785
#define VK_LBUTTON
Definition: winuser.h:2193