ReactOS 0.4.17-dev-1133-gc25e4fd
mouse.c File Reference
#include <win32k.h>
Include dependency graph for mouse.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (UserInput)
 
WORD FASTCALL UserGetMouseButtonsState (VOID)
 
VOID NTAPI UserRawInputMouseProcess (PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA mid)
 
VOID NTAPI UserProcessMouseInput (PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA mid)
 
DWORD IntFixMouseInputButtons (DWORD dwFlags)
 
BOOL NTAPI UserSendMouseInput (MOUSEINPUT *pmi, BOOL bInjected)
 
VOID FASTCALL IntRemoveTrackMouseEvent (PDESKTOP pDesk)
 
BOOL FASTCALL IntQueryTrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack)
 
BOOL FASTCALL IntTrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack)
 
BOOL APIENTRY NtUserTrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack)
 
DWORD APIENTRY NtUserGetMouseMovePointsEx (UINT cbSize, LPMOUSEMOVEPOINT lpptIn, LPMOUSEMOVEPOINT lpptOut, int nBufPoints, DWORD resolution)
 

Variables

MOUSEMOVEPOINT gMouseHistoryOfMoves [64]
 
INT gcMouseHistoryOfMoves = 0
 

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserInput  )

◆ IntFixMouseInputButtons()

DWORD IntFixMouseInputButtons ( DWORD  dwFlags)

Definition at line 205 of file mouse.c.

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}
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1196
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1198
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1195
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1197
BOOL bMouseBtnSwap
Definition: sysparams.h:82
SPIVALUES gspv
Definition: sysparams.c:17

Referenced by UserSendMouseInput().

◆ IntQueryTrackMouseEvent()

BOOL FASTCALL IntQueryTrackMouseEvent ( LPTRACKMOUSEEVENT  lpEventTrack)

Definition at line 442 of file mouse.c.

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}
#define DF_TME_LEAVE
Definition: desktop.h:48
#define DF_TME_HOVER
Definition: desktop.h:47
#define TRUE
Definition: types.h:120
#define UserHMGetHandle(obj)
Definition: ntuser.h:233
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:829
#define TME_LEAVE
Definition: commctrl.h:4998
#define TME_NONCLIENT
Definition: commctrl.h:4999
struct tagTRACKMOUSEEVENT TRACKMOUSEEVENT
#define TME_HOVER
Definition: commctrl.h:4997
#define HTCLIENT
Definition: winuser.h:2511
DWORD dwMouseHoverTime
Definition: desktop.h:34
PWND spwndTrack
Definition: desktop.h:31
DWORD htEx
Definition: desktop.h:32
DWORD dwDTFlags
Definition: desktop.h:12
struct _DESKTOP * rpdesk
Definition: win32.h:93
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
THRDESKHEAD head
Definition: ntuser.h:699
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by NtUserTrackMouseEvent().

◆ IntRemoveTrackMouseEvent()

VOID FASTCALL IntRemoveTrackMouseEvent ( PDESKTOP  pDesk)

Definition at line 422 of file mouse.c.

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}
#define NULL
Definition: types.h:112
unsigned int UINT
Definition: sysinfo.c:13
#define WM_MOUSELEAVE
Definition: commctrl.h:4992
#define WM_NCMOUSELEAVE
Definition: winuser.h:1870
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1397
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:579
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27

Referenced by IntSendDestroyMsg().

◆ IntTrackMouseEvent()

BOOL FASTCALL IntTrackMouseEvent ( LPTRACKMOUSEEVENT  lpEventTrack)

Definition at line 477 of file mouse.c.

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}
#define FALSE
Definition: types.h:117
POINTL point
Definition: edittest.c:50
#define TME_CANCEL
Definition: commctrl.h:5001
#define HOVER_DEFAULT
Definition: commctrl.h:5003
#define TRACE(s)
Definition: solgame.cpp:4
RECT rcMouseHover
Definition: desktop.h:33
LONG y
Definition: windef.h:130
LONG x
Definition: windef.h:129
INT iMouseHoverWidth
Definition: sysparams.h:85
INT iMouseHoverHeight
Definition: sysparams.h:86
INT iMouseHoverTime
Definition: sysparams.h:87
Definition: ntuser.h:698
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:123
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
VOID CALLBACK SystemTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: timer.c:286
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

Referenced by NtUserTrackMouseEvent().

◆ NtUserGetMouseMovePointsEx()

DWORD APIENTRY NtUserGetMouseMovePointsEx ( UINT  cbSize,
LPMOUSEMOVEPOINT  lpptIn,
LPMOUSEMOVEPOINT  lpptOut,
int  nBufPoints,
DWORD  resolution 
)

Definition at line 610 of file mouse.c.

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 ERROR_INVALID_PARAMETER
Definition: compat.h:101
static void cleanup(void)
Definition: main.c:1335
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
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
#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
UINT32 cbSize
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:30
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
INT gcMouseHistoryOfMoves
Definition: mouse.c:14
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
#define ERROR_POINT_NOT_FOUND
Definition: winerror.h:1017
#define ERROR_NOACCESS
Definition: winerror.h:902

◆ NtUserTrackMouseEvent()

BOOL APIENTRY NtUserTrackMouseEvent ( LPTRACKMOUSEEVENT  lpEventTrack)

Definition at line 549 of file mouse.c.

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}
unsigned int BOOL
Definition: ntddk_ex.h:94
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
#define TME_QUERY
Definition: commctrl.h:5000
BOOL FASTCALL IntTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:477
BOOL FASTCALL IntQueryTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:442
#define ERROR_INVALID_FLAGS
Definition: winerror.h:907

◆ UserGetMouseButtonsState()

WORD FASTCALL UserGetMouseButtonsState ( VOID  )

Definition at line 22 of file mouse.c.

23{
24 WORD wRet = 0;
25
27
30
31 return wRet;
32}
unsigned short WORD
Definition: ntddk_ex.h:93
#define MK_SHIFT
Definition: winuser.h:2405
#define VK_CONTROL
Definition: winuser.h:2239
#define MK_CONTROL
Definition: winuser.h:2406
#define VK_SHIFT
Definition: winuser.h:2238
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:174

Referenced by co_UserDestroyWindow(), co_WinPosSetWindowPos(), IntDeactivateWindow(), UserAttachThreadInput(), UserDeleteW32Thread(), UserSendMouseInput(), and UserSetCursorPos().

◆ UserProcessMouseInput()

VOID NTAPI UserProcessMouseInput ( PINPUT_DEVICE_INFO  pDeviceInfo,
PMOUSE_INPUT_DATA  mid 
)

Definition at line 104 of file mouse.c.

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}
static MONITORINFO mi
Definition: win.c:9400
#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
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1205
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1203
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1200
#define MOUSEEVENTF_XUP
Definition: winuser.h:1202
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1194
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1201
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1204
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1199
USHORT ButtonData
Definition: ntddmou.h:83
USHORT ButtonFlags
Definition: ntddmou.h:82
USHORT Flags
Definition: ntddmou.h:78
ULONG ExtraInformation
Definition: ntddmou.h:89
DWORD dwFlags
Definition: winuser.h:3895
BOOLEAN RawInputEnabled
Definition: rawinput.c:38
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

Referenced by RawInputThreadMain().

◆ UserRawInputMouseProcess()

VOID NTAPI UserRawInputMouseProcess ( PINPUT_DEVICE_INFO  pDeviceInfo,
PMOUSE_INPUT_DATA  mid 
)

Definition at line 35 of file mouse.c.

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}
WPARAM wParam
Definition: combotst.c:138
struct @1897 Msg[]
#define EngGetTickCount32()
Definition: eng.h:43
static int rm
Definition: i386-dis.c:1289
PSERVERINFO gpsi
Definition: imm.c:18
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
BOOL FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
Definition: msgqueue.c:1337
#define MOUSE_MOVE_RELATIVE
Definition: ntddmou.h:67
#define WM_INPUT
Definition: winuser.h:1740
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
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
HRAWINPUT FASTCALL UserCreateRawInput(PTHREADINFO pti, DWORD dwType, HANDLE hDevice, WPARAM wParam, CONST VOID *pData, UINT cbData)
Definition: rawinput.c:323

Referenced by UserProcessMouseInput().

◆ UserSendMouseInput()

BOOL NTAPI UserSendMouseInput ( MOUSEINPUT *  pmi,
BOOL  bInjected 
)

Definition at line 235 of file mouse.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ARRAYSIZE(a)
Definition: cat.c:25
#define ASSERT(a)
Definition: mode.c:44
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
#define MK_RBUTTON
Definition: winuser.h:2404
#define MAKEWPARAM(l, h)
Definition: winuser.h:4117
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define SM_CYSCREEN
Definition: winuser.h:971
#define VK_RBUTTON
Definition: winuser.h:2227
#define WM_RBUTTONUP
Definition: winuser.h:1808
#define VK_MBUTTON
Definition: winuser.h:2229
#define WM_LBUTTONDOWN
Definition: winuser.h:1804
#define WM_RBUTTONDOWN
Definition: winuser.h:1807
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
#define MK_MBUTTON
Definition: winuser.h:2407
#define WM_LBUTTONUP
Definition: winuser.h:1805
#define MK_LBUTTON
Definition: winuser.h:2403
#define SM_CXSCREEN
Definition: winuser.h:970
#define WM_MBUTTONUP
Definition: winuser.h:1811
#define WM_MBUTTONDOWN
Definition: winuser.h:1810
#define VK_LBUTTON
Definition: winuser.h:2226
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
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
#define WM_MOUSEWHEEL
Definition: treelist.c:96
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
#define SET_KEY_DOWN(ks, vk, down)
Definition: input.h:176
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:209
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:205

Referenced by co_UserSetCapture(), NtUserSendInput(), and UserProcessMouseInput().

Variable Documentation

◆ gcMouseHistoryOfMoves

INT gcMouseHistoryOfMoves = 0

Definition at line 14 of file mouse.c.

Referenced by NtUserGetMouseMovePointsEx(), and UserSendMouseInput().

◆ gMouseHistoryOfMoves

MOUSEMOVEPOINT gMouseHistoryOfMoves[64]

Definition at line 13 of file mouse.c.

Referenced by NtUserGetMouseMovePointsEx(), and UserSendMouseInput().