ReactOS  0.4.14-dev-554-g2f8d847
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>
11 DBG_DEFAULT_CHANNEL(UserInput);
12 
13 MOUSEMOVEPOINT 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  */
39 VOID NTAPI
41 {
42  MOUSEINPUT mi;
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)
59  if (mid->Flags & MOUSE_VIRTUAL_DESKTOP)
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  }
88  if (mid->ButtonFlags & MOUSE_BUTTON_4_UP)
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 */
102  if (mid->ButtonFlags & MOUSE_BUTTON_5_DOWN)
103  {
104  mi.mouseData |= XBUTTON2;
106  }
107  if (mid->ButtonFlags & MOUSE_BUTTON_5_UP)
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  */
137 DWORD
139 {
140  DWORD dwNewFlags;
141 
142  if (!gspv.bMouseBtnSwap)
143  return dwFlags;
144 
145  /* Buttons other than left and right are not affected */
146  dwNewFlags = dwFlags & ~(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP |
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  */
167 BOOL NTAPI
169 {
170  POINT ptCursor;
171  PSYSTEM_CURSORINFO pCurInfo;
172  MSG Msg;
173  DWORD dwFlags;
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 
353 VOID
354 FASTCALL
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 */
369  pDesk->dwDTFlags &= ~(DF_TME_LEAVE|DF_TME_HOVER);
370  pDesk->spwndTrack = NULL;
371 }
372 
373 BOOL
374 FASTCALL
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 
408 BOOL
409 FASTCALL
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.
474  point.y + gspv.iMouseHoverHeight / 2);
475  }
476  }
477  return TRUE;
478 }
479 
480 BOOL
481 APIENTRY
483  LPTRACKMOUSEEVENT lpEventTrack)
484 {
485  TRACKMOUSEEVENT SafeTME;
486  BOOL bRet = FALSE;
487 
488  TRACE("Enter NtUserTrackMouseEvent\n");
489 
490  _SEH2_TRY
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 
508  if (SafeTME.dwFlags & ~(TME_CANCEL | TME_QUERY | TME_NONCLIENT | TME_LEAVE | TME_HOVER) )
509  {
511  return FALSE;
512  }
513 
515 
516  if (SafeTME.dwFlags & TME_QUERY)
517  {
518  bRet = IntQueryTrackMouseEvent(&SafeTME);
519  _SEH2_TRY
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 
541 DWORD
542 APIENTRY
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 
568  _SEH2_TRY
569  {
570  ProbeForRead(lpptIn, cbSize, 1);
571  RtlCopyMemory(&Safeppt, lpptIn, cbSize);
572  }
574  {
576  _SEH2_YIELD(return (DWORD)-1);
577  }
578  _SEH2_END;
579 
580  UserEnterShared();
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  {
618  _SEH2_TRY
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 
639 cleanup:
640  TRACE("Leave NtUserGetMouseMovePointsEx, ret=%i\n", iRet);
641  UserLeave();
642  return (DWORD)iRet;
643 }
#define WM_MBUTTONUP
Definition: winuser.h:1765
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type)
Definition: timer.c:177
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1170
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1181
DWORD htEx
Definition: desktop.h:32
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
#define MAKEWPARAM(l, h)
Definition: winuser.h:3984
#define TME_NONCLIENT
Definition: commctrl.h:4978
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1180
#define MK_SHIFT
Definition: winuser.h:2344
#define MOUSE_MIDDLE_BUTTON_DOWN
Definition: ntddmou.h:50
#define MOUSE_LEFT_BUTTON_DOWN
Definition: ntddmou.h:46
PWND spwndTrack
Definition: desktop.h:31
#define ID_EVENT_SYSTIMER_MOUSEHOVER
Definition: timer.h:27
long y
Definition: polytest.cpp:48
#define WM_LBUTTONDOWN
Definition: winuser.h:1758
#define MK_LBUTTON
Definition: winuser.h:2342
long x
Definition: polytest.cpp:48
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1028
#define VK_LBUTTON
Definition: winuser.h:2165
BOOL bMouseBtnSwap
Definition: sysparams.h:82
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1178
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1176
#define EngGetTickCount32()
Definition: eng.h:43
#define WM_MOUSEWHEEL
Definition: treelist.c:96
#define MOUSE_WHEEL
Definition: ntddmou.h:56
#define MK_MBUTTON
Definition: winuser.h:2346
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WARN(fmt,...)
Definition: debug.h:111
#define MAKELPARAM(l, h)
Definition: winuser.h:3983
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer)
Definition: timer.c:573
struct @1591 Msg[]
#define DF_TME_LEAVE
Definition: desktop.h:48
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static MONITORINFO mi
Definition: win.c:7339
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1174
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1175
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:168
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
INT iMouseHoverHeight
Definition: sysparams.h:86
#define FASTCALL
Definition: nt_native.h:50
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
struct _DESKTOP * rpdesk
Definition: win32.h:91
PSERVERINFO gpsi
Definition: main.c:27
int32_t INT
Definition: typedefs.h:56
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
POINTL point
Definition: edittest.c:50
RECT rcMouseHover
Definition: desktop.h:33
LONG y
Definition: windef.h:330
DWORD APIENTRY NtUserGetMouseMovePointsEx(UINT cbSize, LPMOUSEMOVEPOINT lpptIn, LPMOUSEMOVEPOINT lpptOut, int nBufPoints, DWORD resolution)
Definition: mouse.c:543
_SEH2_TRY
Definition: create.c:4250
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1179
USHORT Flags
Definition: ntddmou.h:78
INT iMouseHoverWidth
Definition: sysparams.h:85
#define SM_CXSCREEN
Definition: winuser.h:949
#define ERROR_NOACCESS
Definition: winerror.h:578
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define VK_RBUTTON
Definition: winuser.h:2166
unsigned int BOOL
Definition: ntddk_ex.h:94
#define SET_KEY_DOWN(ks, vk, down)
Definition: input.h:100
#define MOUSE_BUTTON_4_DOWN
Definition: ntddmou.h:52
DWORD dwDTFlags
Definition: desktop.h:12
#define WM_MOUSELEAVE
Definition: commctrl.h:4971
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define MOUSE_BUTTON_4_UP
Definition: ntddmou.h:53
#define VK_SHIFT
Definition: winuser.h:2177
THRDESKHEAD head
Definition: ntuser.h:659
BOOL FASTCALL IntQueryTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:375
VOID CALLBACK SystemTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Definition: timer.c:280
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
smooth NULL
Definition: ftsmooth.c:416
#define ERROR_POINT_NOT_FOUND
Definition: winerror.h:693
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
#define MK_RBUTTON
Definition: winuser.h:2343
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1029
static POINTER_INPUT_TYPE *static LPMOUSEMOVEPOINT
Definition: input.c:89
#define WM_RBUTTONDOWN
Definition: winuser.h:1761
#define MOUSE_BUTTON_5_UP
Definition: ntddmou.h:55
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define SM_CYSCREEN
Definition: winuser.h:950
#define TRACE(s)
Definition: solgame.cpp:4
INT gcMouseHistoryOfMoves
Definition: mouse.c:14
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
#define _SEH2_YIELD(STMT_)
Definition: pseh2_64.h:8
#define TMRF_SYSTEM
Definition: timer.h:20
ULONG ExtraInformation
Definition: ntddmou.h:89
#define TME_QUERY
Definition: commctrl.h:4979
unsigned short WORD
Definition: ntddk_ex.h:93
SPIVALUES gspv
Definition: sysparams.c:17
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
unsigned long DWORD
Definition: ntddk_ex.h:95
LONG x
Definition: windef.h:329
#define MOUSE_LEFT_BUTTON_UP
Definition: ntddmou.h:47
#define MOUSE_MIDDLE_BUTTON_UP
Definition: ntddmou.h:51
#define MOUSE_RIGHT_BUTTON_DOWN
Definition: ntddmou.h:48
#define WM_RBUTTONUP
Definition: winuser.h:1762
ULONG_PTR dwExtraInfo
Definition: winable.h:44
USHORT ButtonData
Definition: ntddmou.h:83
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
DWORD dwMouseHoverTime
Definition: desktop.h:34
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
INT iMouseHoverTime
Definition: sysparams.h:87
USHORT ButtonFlags
Definition: ntddmou.h:82
struct tagTRACKMOUSEEVENT TRACKMOUSEEVENT
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1171
#define HOVER_DEFAULT
Definition: commctrl.h:4982
#define DF_TME_HOVER
Definition: desktop.h:47
VOID FASTCALL SetLastNtError(NTSTATUS Status)
Definition: error.c:36
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1173
BOOL APIENTRY NtUserTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:482
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
_SEH2_END
Definition: create.c:4424
#define TME_HOVER
Definition: commctrl.h:4976
#define TME_CANCEL
Definition: commctrl.h:4980
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1169
#define TME_LEAVE
Definition: commctrl.h:4977
#define WM_LBUTTONUP
Definition: winuser.h:1759
#define WM_MBUTTONDOWN
Definition: winuser.h:1764
DWORD mouseData
Definition: winable.h:41
unsigned int UINT
Definition: ndis.h:50
#define MOUSEEVENTF_XUP
Definition: winuser.h:1177
#define MK_CONTROL
Definition: winuser.h:2345
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:138
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
#define VK_CONTROL
Definition: winuser.h:2178
DWORD time
Definition: winable.h:43
DWORD dwFlags
Definition: winuser.h:3762
VOID FASTCALL IntRemoveTrackMouseEvent(PDESKTOP pDesk)
Definition: mouse.c:355
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define WM_NCMOUSELEAVE
Definition: winuser.h:1824
#define MOUSE_RIGHT_BUTTON_UP
Definition: ntddmou.h:49
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:98
char * cleanup(char *str)
Definition: wpickclick.c:99
#define MOUSE_BUTTON_5_DOWN
Definition: ntddmou.h:54
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:12
#define HTCLIENT
Definition: winuser.h:2450
#define MOUSE_MOVE_ABSOLUTE
Definition: ntddmou.h:68
DWORD dwFlags
Definition: winable.h:42
VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA mid)
Definition: mouse.c:40
#define VK_MBUTTON
Definition: winuser.h:2168
DBG_DEFAULT_CHANNEL(UserInput)
BOOL FASTCALL IntTrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack)
Definition: mouse.c:410
#define ERROR_INVALID_FLAGS
Definition: winerror.h:583
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1172
#define APIENTRY
Definition: api.h:79
#define MOUSE_VIRTUAL_DESKTOP
Definition: ntddmou.h:69