ReactOS 0.4.17-dev-1133-gc25e4fd
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
36{
37 PTHREADINFO pti;
38 HWND hwndTarget;
40 HRAWINPUT hRawInput;
41 RAWMOUSE rm = {0};
42 MSG Msg = {0};
43
44 if (!UserGetRawInputTarget(RIM_TYPEMOUSE, &pti, &hwndTarget, &wParam))
45 return;
46
47 if (mid->LastX != 0 || mid->LastY != 0)
48 {
49 rm.usFlags |= MOUSE_MOVE_RELATIVE;
50 }
51
52 /* Flags for absolute move */
53 if (mid->Flags & MOUSE_MOVE_ABSOLUTE)
54 rm.usFlags |= MOUSE_MOVE_ABSOLUTE;
56 rm.usFlags |= MOUSE_VIRTUAL_DESKTOP;
57
58 /* Left button */
60 rm.usButtonFlags |= RI_MOUSE_LEFT_BUTTON_DOWN;
62 rm.usButtonFlags |= RI_MOUSE_LEFT_BUTTON_UP;
63
64 /* Middle button */
66 rm.usButtonFlags |= RI_MOUSE_MIDDLE_BUTTON_DOWN;
68 rm.usButtonFlags |= RI_MOUSE_MIDDLE_BUTTON_UP;
69
70 /* Right button */
72 rm.usButtonFlags |= RI_MOUSE_RIGHT_BUTTON_DOWN;
74 rm.usButtonFlags |= RI_MOUSE_RIGHT_BUTTON_UP;
75 rm.lLastX = mid->LastX;
76 rm.lLastY = mid->LastY;
77
78 hRawInput = UserCreateRawInput(pti,
79 RIM_TYPEMOUSE,
80 (HANDLE)pDeviceInfo,
81 wParam,
82 &rm,
83 sizeof(rm));
84 if (!hRawInput)
85 return;
86
87 Msg.hwnd = hwndTarget;
88 Msg.message = WM_INPUT;
89 Msg.wParam = wParam;
90 Msg.lParam = (LPARAM)hRawInput;
91 Msg.time = EngGetTickCount32();
92 Msg.pt = gpsi->ptCursor;
93
94 if (!MsqPostMessage(pti, &Msg, TRUE, QS_RAWINPUT, 0, 0))
95 UserFreeRawInput(pti->MessageQueue, hRawInput);
96}
97
98/*
99 * UserProcessMouseInput
100 *
101 * Process raw mouse input data
102 */
105{
107
108 /* Convert MOUSE_INPUT_DATA to MOUSEINPUT. First init all fields. */
109 mi.dx = mid->LastX;
110 mi.dy = mid->LastY;
111 mi.mouseData = 0;
112 mi.dwFlags = 0;
113 mi.time = 0;
114 mi.dwExtraInfo = mid->ExtraInformation;
115
116 if (RawInputEnabled == TRUE)
117 UserRawInputMouseProcess(pDeviceInfo, mid);
118
119 /* Mouse position */
120 if (mi.dx != 0 || mi.dy != 0)
122
123 /* Flags for absolute move */
124 if (mid->Flags & MOUSE_MOVE_ABSOLUTE)
126 if (mid->Flags & MOUSE_VIRTUAL_DESKTOP)
128
129 /* Left button */
134
135 /* Middle button */
140
141 /* Right button */
146
147 /* Note: Next buttons use mouseData field so they cannot be sent in one call */
148
149 /* Button 4 */
151 {
153 mi.mouseData |= XBUTTON1;
154 }
156 {
158 mi.mouseData |= XBUTTON1;
159 }
160
161 /* If mouseData is used by button 4, send input and clear mi */
163 {
165 RtlZeroMemory(&mi, sizeof(mi));
166 }
167
168 /* Button 5 */
170 {
171 mi.mouseData |= XBUTTON2;
173 }
175 {
176 mi.mouseData |= XBUTTON2;
178 }
179
180 /* If mouseData is used by button 5, send input and clear mi */
182 {
184 RtlZeroMemory(&mi, sizeof(mi));
185 }
186
187 /* Mouse wheel */
188 if (mid->ButtonFlags & MOUSE_WHEEL)
189 {
190 mi.mouseData = mid->ButtonData;
192 }
193
194 /* If something has changed, send input to user */
195 if (mi.dwFlags)
197}
198
199/*
200 * IntFixMouseInputButtons
201 *
202 * Helper function for supporting mouse button swap function
203 */
204DWORD
206{
207 DWORD dwNewFlags;
208
209 if (!gspv.bMouseBtnSwap)
210 return dwFlags;
211
212 /* Buttons other than left and right are not affected */
215
216 /* Swap buttons */
218 dwNewFlags |= MOUSEEVENTF_RIGHTDOWN;
220 dwNewFlags |= MOUSEEVENTF_RIGHTUP;
222 dwNewFlags |= MOUSEEVENTF_LEFTDOWN;
224 dwNewFlags |= MOUSEEVENTF_LEFTUP;
225
226 return dwNewFlags;
227}
228
229/*
230 * UserSendMouseInput
231 *
232 * Process mouse input from input devices and SendInput API
233 */
236{
237 POINT ptCursor;
238 PSYSTEM_CURSORINFO pCurInfo;
239 MSG Msg;
241
242 ASSERT(pmi);
243
244 pCurInfo = IntGetSysCursorInfo();
245 ptCursor = gpsi->ptCursor;
247
249
250 if (pmi->dwFlags & MOUSEEVENTF_MOVE)
251 {
252 /* Mouse has changes position */
253 if (!(pmi->dwFlags & MOUSEEVENTF_ABSOLUTE))
254 {
255 /* Relative move */
256 ptCursor.x += pmi->dx;
257 ptCursor.y += pmi->dy;
258 }
259 else if (pmi->dwFlags & MOUSEEVENTF_VIRTUALDESK)
260 {
261 /* Absolute move in virtual screen units */
262 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXVIRTUALSCREEN) >> 16;
263 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYVIRTUALSCREEN) >> 16;
264 }
265 else
266 {
267 /* Absolute move in primary monitor units */
268 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXSCREEN) >> 16;
269 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYSCREEN) >> 16;
270 }
271 }
272
273 /* Init message fields */
274 Msg.wParam = UserGetMouseButtonsState();
275 Msg.lParam = MAKELPARAM(ptCursor.x, ptCursor.y);
276 Msg.pt = ptCursor;
277 Msg.time = pmi->time;
278 if (!Msg.time)
279 {
280 Msg.time = EngGetTickCount32();
281 }
282
283 /* Do GetMouseMovePointsEx FIFO. */
289 gcMouseHistoryOfMoves = 0; // 0 - 63 is 64, FIFO forwards.
290
291 /* Update cursor position */
293 {
294 UserSetCursorPos(ptCursor.x, ptCursor.y, bInjected, pmi->dwExtraInfo, TRUE);
295 }
296
298 pCurInfo->ButtonsDown |= MK_SHIFT;
299 else
300 pCurInfo->ButtonsDown &= ~MK_SHIFT;
301
303 pCurInfo->ButtonsDown |= MK_CONTROL;
304 else
305 pCurInfo->ButtonsDown &= ~MK_CONTROL;
306
307 /* Left button */
309 {
311 Msg.message = WM_LBUTTONDOWN;
312 pCurInfo->ButtonsDown |= MK_LBUTTON;
313 Msg.wParam |= MK_LBUTTON;
314 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
315 }
316 else if (dwFlags & MOUSEEVENTF_LEFTUP)
317 {
319 Msg.message = WM_LBUTTONUP;
320 pCurInfo->ButtonsDown &= ~MK_LBUTTON;
321 Msg.wParam &= ~MK_LBUTTON;
322 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
323 }
324
325 /* Middle button */
327 {
329 Msg.message = WM_MBUTTONDOWN;
330 pCurInfo->ButtonsDown |= MK_MBUTTON;
331 Msg.wParam |= MK_MBUTTON;
332 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
333 }
334 else if (dwFlags & MOUSEEVENTF_MIDDLEUP)
335 {
337 Msg.message = WM_MBUTTONUP;
338 pCurInfo->ButtonsDown &= ~MK_MBUTTON;
339 Msg.wParam &= ~MK_MBUTTON;
340 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
341 }
342
343 /* Right button */
345 {
347 Msg.message = WM_RBUTTONDOWN;
348 pCurInfo->ButtonsDown |= MK_RBUTTON;
349 Msg.wParam |= MK_RBUTTON;
350 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
351 }
352 else if (dwFlags & MOUSEEVENTF_RIGHTUP)
353 {
355 Msg.message = WM_RBUTTONUP;
356 pCurInfo->ButtonsDown &= ~MK_RBUTTON;
357 Msg.wParam &= ~MK_RBUTTON;
358 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
359 }
360
363 {
364 /* Fail because both types of events use the mouseData field */
365 WARN("Invalid flags!\n");
366 return FALSE;
367 }
368
369 /* X-Button (4 or 5) */
371 {
372 Msg.message = WM_XBUTTONDOWN;
373 if (pmi->mouseData & XBUTTON1)
374 {
375 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, TRUE);
376 pCurInfo->ButtonsDown |= MK_XBUTTON1;
377 Msg.wParam |= MAKEWPARAM(MK_XBUTTON1, XBUTTON1);
378 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
379 }
380 if (pmi->mouseData & XBUTTON2)
381 {
382 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, TRUE);
383 pCurInfo->ButtonsDown |= MK_XBUTTON2;
384 Msg.wParam |= MAKEWPARAM(MK_XBUTTON2, XBUTTON2);
385 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
386 }
387 }
388 else if (dwFlags & MOUSEEVENTF_XUP)
389 {
390 Msg.message = WM_XBUTTONUP;
391 if(pmi->mouseData & XBUTTON1)
392 {
393 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, FALSE);
394 pCurInfo->ButtonsDown &= ~MK_XBUTTON1;
395 Msg.wParam &= ~MK_XBUTTON1;
396 Msg.wParam |= MAKEWPARAM(0, XBUTTON1);
397 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
398 }
399 if (pmi->mouseData & XBUTTON2)
400 {
401 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, FALSE);
402 pCurInfo->ButtonsDown &= ~MK_XBUTTON2;
403 Msg.wParam &= ~MK_XBUTTON2;
404 Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
405 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
406 }
407 }
408
409 /* Mouse wheel */
411 {
412 Msg.message = WM_MOUSEWHEEL;
413 Msg.wParam = MAKEWPARAM(pCurInfo->ButtonsDown, pmi->mouseData);
414 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
415 }
416
417 return TRUE;
418}
419
420VOID
423 PDESKTOP pDesk)
424{
425 /* Generate a leave message */
426 if (pDesk->dwDTFlags & DF_TME_LEAVE)
427 {
428 UINT uMsg = (pDesk->htEx != HTCLIENT) ? WM_NCMOUSELEAVE : WM_MOUSELEAVE;
429 UserPostMessage(UserHMGetHandle(pDesk->spwndTrack), uMsg, 0, 0);
430 }
431 /* Kill the timer */
432 if (pDesk->dwDTFlags & DF_TME_HOVER)
434
435 /* Reset state */
437 pDesk->spwndTrack = NULL;
438}
439
440BOOL
443 LPTRACKMOUSEEVENT lpEventTrack)
444{
445 PDESKTOP pDesk;
446 PTHREADINFO pti;
447
449 pDesk = pti->rpdesk;
450
451 /* Always cleared with size set and return true. */
452 RtlZeroMemory(lpEventTrack , sizeof(TRACKMOUSEEVENT));
453 lpEventTrack->cbSize = sizeof(TRACKMOUSEEVENT);
454
455 if (pDesk->dwDTFlags & (DF_TME_LEAVE | DF_TME_HOVER) &&
456 pDesk->spwndTrack &&
457 pti->MessageQueue == pDesk->spwndTrack->head.pti->MessageQueue)
458 {
459 if (pDesk->htEx != HTCLIENT)
460 lpEventTrack->dwFlags |= TME_NONCLIENT;
461
462 if (pDesk->dwDTFlags & DF_TME_LEAVE)
463 lpEventTrack->dwFlags |= TME_LEAVE;
464
465 if (pDesk->dwDTFlags & DF_TME_HOVER)
466 {
467 lpEventTrack->dwFlags |= TME_HOVER;
468 lpEventTrack->dwHoverTime = pDesk->dwMouseHoverTime;
469 }
470 lpEventTrack->hwndTrack = UserHMGetHandle(pDesk->spwndTrack);
471 }
472 return TRUE;
473}
474
475BOOL
478 LPTRACKMOUSEEVENT lpEventTrack)
479{
480 PDESKTOP pDesk;
481 PTHREADINFO pti;
482 PWND pWnd;
483 POINT point;
484
486 pDesk = pti->rpdesk;
487
488 if (!(pWnd = UserGetWindowObject(lpEventTrack->hwndTrack)))
489 return FALSE;
490
491 if ( pDesk->spwndTrack != pWnd ||
492 (pDesk->htEx != HTCLIENT) ^ !!(lpEventTrack->dwFlags & TME_NONCLIENT) )
493 {
494 if ( lpEventTrack->dwFlags & TME_LEAVE && !(lpEventTrack->dwFlags & TME_CANCEL) )
495 {
496 UserPostMessage( lpEventTrack->hwndTrack,
498 0, 0);
499 }
500 TRACE("IntTrackMouseEvent spwndTrack %p pwnd %p\n", pDesk->spwndTrack, pWnd);
501 return TRUE;
502 }
503
504 /* Tracking spwndTrack same as pWnd */
505 if (lpEventTrack->dwFlags & TME_CANCEL) // Canceled mode.
506 {
507 if (lpEventTrack->dwFlags & TME_LEAVE)
508 pDesk->dwDTFlags &= ~DF_TME_LEAVE;
509
510 if (lpEventTrack->dwFlags & TME_HOVER)
511 {
512 if (pDesk->dwDTFlags & DF_TME_HOVER)
513 { // Kill hover timer.
515 pDesk->dwDTFlags &= ~DF_TME_HOVER;
516 }
517 }
518 }
519 else // Not Canceled.
520 {
521 if (lpEventTrack->dwFlags & TME_LEAVE)
522 pDesk->dwDTFlags |= DF_TME_LEAVE;
523
524 if (lpEventTrack->dwFlags & TME_HOVER)
525 {
526 pDesk->dwDTFlags |= DF_TME_HOVER;
527
528 if (!lpEventTrack->dwHoverTime || lpEventTrack->dwHoverTime == HOVER_DEFAULT)
529 pDesk->dwMouseHoverTime = gspv.iMouseHoverTime; // use the system default hover time-out.
530 else
531 pDesk->dwMouseHoverTime = lpEventTrack->dwHoverTime;
532 // Start timer for the hover period.
534 // Get windows thread message points.
535 point = pWnd->head.pti->ptLast;
536 // Set desktop mouse hover from the system default hover rectangle.
542 }
543 }
544 return TRUE;
545}
546
547BOOL
550 LPTRACKMOUSEEVENT lpEventTrack)
551{
552 TRACKMOUSEEVENT SafeTME;
553 BOOL bRet = FALSE;
554
555 TRACE("Enter NtUserTrackMouseEvent\n");
556
558 {
559 ProbeForRead(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1);
560 RtlCopyMemory(&SafeTME, lpEventTrack, sizeof(TRACKMOUSEEVENT));
561 }
563 {
565 _SEH2_YIELD(return FALSE);
566 }
567 _SEH2_END;
568
569 if (SafeTME.cbSize != sizeof(TRACKMOUSEEVENT))
570 {
572 return FALSE;
573 }
574
576 {
578 return FALSE;
579 }
580
582
583 if (SafeTME.dwFlags & TME_QUERY)
584 {
585 bRet = IntQueryTrackMouseEvent(&SafeTME);
587 {
588 ProbeForWrite(lpEventTrack, sizeof(TRACKMOUSEEVENT), 1);
589 RtlCopyMemory(lpEventTrack, &SafeTME, sizeof(TRACKMOUSEEVENT));
590 }
592 {
594 bRet = FALSE;
595 }
596 _SEH2_END;
597 }
598 else
599 {
600 bRet = IntTrackMouseEvent(&SafeTME);
601 }
602
603 TRACE("Leave NtUserTrackMouseEvent, ret=%i\n", bRet);
604 UserLeave();
605 return bRet;
606}
607
608DWORD
611 UINT cbSize,
612 LPMOUSEMOVEPOINT lpptIn,
613 LPMOUSEMOVEPOINT lpptOut,
614 int nBufPoints,
615 DWORD resolution)
616{
617 MOUSEMOVEPOINT Safeppt;
618 //BOOL Hit;
619 INT iRet = -1;
620
621 TRACE("Enter NtUserGetMouseMovePointsEx\n");
622
623 if ((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64))
624 {
626 return (DWORD)-1;
627 }
628
629 if (!lpptIn || (!lpptOut && nBufPoints))
630 {
632 return (DWORD)-1;
633 }
634
636 {
637 ProbeForRead(lpptIn, cbSize, 1);
638 RtlCopyMemory(&Safeppt, lpptIn, cbSize);
639 }
641 {
643 _SEH2_YIELD(return (DWORD)-1);
644 }
645 _SEH2_END;
646
648
649 // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmousemovepointsex
650 // This explains the math issues in transforming points.
651 iRet = gcMouseHistoryOfMoves; // FIFO is forward so retrieve backward.
652 //Hit = FALSE;
653 do
654 {
655 if (Safeppt.x == 0 && Safeppt.y == 0)
656 break; // No test.
657 // Finds the point, it returns the last nBufPoints prior to and including the supplied point.
658 if (gMouseHistoryOfMoves[iRet].x == Safeppt.x && gMouseHistoryOfMoves[iRet].y == Safeppt.y)
659 {
660 if (Safeppt.time) // Now test time and it seems to be absolute.
661 {
662 if (Safeppt.time == gMouseHistoryOfMoves[iRet].time)
663 {
664 //Hit = TRUE;
665 break;
666 }
667 else
668 {
669 if (--iRet < 0) iRet = 63;
670 continue;
671 }
672 }
673 //Hit = TRUE;
674 break;
675 }
676 if (--iRet < 0) iRet = 63;
677 }
678 while (iRet != gcMouseHistoryOfMoves);
679
680 switch(resolution)
681 {
682 case GMMP_USE_DISPLAY_POINTS:
683 if (nBufPoints)
684 {
686 {
687 ProbeForWrite(lpptOut, cbSize, 1);
688 }
690 {
692 iRet = -1;
693 _SEH2_YIELD(goto cleanup);
694 }
695 _SEH2_END;
696 }
697 iRet = nBufPoints;
698 break;
699 case GMMP_USE_HIGH_RESOLUTION_POINTS:
700 break;
701 default:
703 iRet = -1;
704 }
705
706cleanup:
707 TRACE("Leave NtUserGetMouseMovePointsEx, ret=%i\n", iRet);
708 UserLeave();
709 return (DWORD)iRet;
710}
#define WARN(fmt,...)
Definition: precomp.h:61
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
#define ARRAYSIZE(a)
Definition: cat.c:25
WPARAM wParam
Definition: combotst.c:138
struct @1897 Msg[]
#define DF_TME_LEAVE
Definition: desktop.h:48
#define DF_TME_HOVER
Definition: desktop.h:47
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
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 short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
unsigned int UINT
Definition: sysinfo.c:13
static int rm
Definition: i386-dis.c:1289
PSERVERINFO gpsi
Definition: imm.c:18
#define UserHMGetHandle(obj)
Definition: ntuser.h:233
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#define ASSERT(a)
Definition: mode.c:44
static POINTER_INPUT_TYPE *static POINTER_INFO *static UINT32 POINTER_INFO *static UINT32 POINTER_INFO *static UINT32 UINT32 POINTER_INFO *static LPMOUSEMOVEPOINT
Definition: input.c:445
static MONITORINFO mi
Definition: win.c:9400
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
BOOL FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
Definition: msgqueue.c:1337
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#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_MOVE_RELATIVE
Definition: ntddmou.h:67
#define MOUSE_RIGHT_BUTTON_DOWN
Definition: ntddmou.h:48
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:829
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
#define TME_CANCEL
Definition: commctrl.h:5001
#define TME_LEAVE
Definition: commctrl.h:4998
#define HOVER_DEFAULT
Definition: commctrl.h:5003
#define WM_MOUSELEAVE
Definition: commctrl.h:4992
#define TME_NONCLIENT
Definition: commctrl.h:4999
struct tagTRACKMOUSEEVENT TRACKMOUSEEVENT
#define TME_QUERY
Definition: commctrl.h:5000
#define TME_HOVER
Definition: commctrl.h:4997
#define MK_RBUTTON
Definition: winuser.h:2404
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1205
#define MAKEWPARAM(l, h)
Definition: winuser.h:4117
#define MK_SHIFT
Definition: winuser.h:2405
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define SM_CYSCREEN
Definition: winuser.h:971
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1196
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1203
#define VK_RBUTTON
Definition: winuser.h:2227
#define VK_CONTROL
Definition: winuser.h:2239
#define WM_RBUTTONUP
Definition: winuser.h:1808
#define VK_MBUTTON
Definition: winuser.h:2229
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1198
#define WM_INPUT
Definition: winuser.h:1740
#define WM_LBUTTONDOWN
Definition: winuser.h:1804
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1200
#define MOUSEEVENTF_XUP
Definition: winuser.h:1202
#define WM_RBUTTONDOWN
Definition: winuser.h:1807
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1194
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1195
#define MK_MBUTTON
Definition: winuser.h:2407
#define MK_CONTROL
Definition: winuser.h:2406
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1201
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1204
#define HTCLIENT
Definition: winuser.h:2511
#define WM_LBUTTONUP
Definition: winuser.h:1805
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1197
#define MK_LBUTTON
Definition: winuser.h:2403
#define VK_SHIFT
Definition: winuser.h:2238
#define SM_CXSCREEN
Definition: winuser.h:970
#define WM_NCMOUSELEAVE
Definition: winuser.h:1870
#define WM_MBUTTONUP
Definition: winuser.h:1811
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1199
#define WM_MBUTTONDOWN
Definition: winuser.h:1810
#define VK_LBUTTON
Definition: winuser.h:2226
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:207
#define TRACE(s)
Definition: solgame.cpp:4
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
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:130
LONG x
Definition: windef.h:129
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:93
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
Definition: ntuser.h:698
THRDESKHEAD head
Definition: ntuser.h:699
DWORD dwFlags
Definition: winuser.h:3895
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
UINT32 cbSize
#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:123
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:30
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 SET_KEY_DOWN(ks, vk, down)
Definition: input.h:176
BOOL FASTCALL UserFreeRawInput(PUSER_MESSAGE_QUEUE MessageQueue, HRAWINPUT hRawInput)
Definition: rawinput.c:364
BOOL FASTCALL UserGetRawInputTarget(DWORD dwType, PTHREADINFO *ppti, HWND *phwndTarget, WPARAM *pwParam)
Definition: rawinput.c:413
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:174
HRAWINPUT FASTCALL UserCreateRawInput(PTHREADINFO pti, DWORD dwType, HANDLE hDevice, WPARAM wParam, CONST VOID *pData, UINT cbData)
Definition: rawinput.c:323
BOOLEAN RawInputEnabled
Definition: rawinput.c:38
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1397
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:209
BOOL FASTCALL IntTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:477
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:205
DWORD APIENTRY NtUserGetMouseMovePointsEx(UINT cbSize, LPMOUSEMOVEPOINT lpptIn, LPMOUSEMOVEPOINT lpptOut, int nBufPoints, DWORD resolution)
Definition: mouse.c:610
VOID NTAPI UserRawInputMouseProcess(PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA mid)
Definition: mouse.c:35
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:235
BOOL APIENTRY NtUserTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:549
BOOL FASTCALL IntQueryTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:442
VOID FASTCALL IntRemoveTrackMouseEvent(PDESKTOP pDesk)
Definition: mouse.c:422
INT gcMouseHistoryOfMoves
Definition: mouse.c:14
VOID NTAPI UserProcessMouseInput(PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA mid)
Definition: mouse.c:104
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
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
#define ERROR_POINT_NOT_FOUND
Definition: winerror.h:1017
#define ERROR_INVALID_FLAGS
Definition: winerror.h:907
#define ERROR_NOACCESS
Definition: winerror.h:902