Zzz – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using System;
2 using System.Drawing;
3 using System.Threading;
4  
5 namespace Zzz.Idle
6 {
7 public class MouseInput : IDisposable
8 {
9 #region Static Fields and Constants
10  
11 private const int WhMouseLl = 14;
12  
13 private static Timer _mouseMovedTimer;
14  
15 #endregion
16  
17 #region Public Events & Delegates
18  
19 public event EventHandler<MouseMovedEventArgs> MouseMoved;
20  
21 public event EventHandler<EventArgs> MouseClicked;
22  
23 public event EventHandler<EventArgs> MouseWheelScrolled;
24  
25 #endregion
26  
27 #region Private Delegates, Events, Enums, Properties, Indexers and Fields
28  
29 private readonly WindowsHookHelper.HookDelegate _mouseDelegate;
30  
31 private readonly IntPtr _mouseHandle;
32  
33 private bool _disposed;
34  
35 private Point? _startMousePosition;
36  
37 private Point? _stopMousePosition;
38  
39 #endregion
40  
41 #region Constructors, Destructors and Finalizers
42  
43 public MouseInput()
44 {
45 _mouseMovedTimer = new Timer(MouseMovementStopped, null, TimeSpan.FromSeconds(1), TimeSpan.Zero);
46  
47 _mouseDelegate = MouseHookDelegate;
48 _mouseHandle = WindowsHookHelper.SetWindowsHookEx(WhMouseLl, _mouseDelegate, IntPtr.Zero, 0);
49 }
50  
51 public void Dispose()
52 {
53 _mouseMovedTimer?.Dispose();
54 _mouseMovedTimer = null;
55  
56 Dispose(true);
57 }
58  
59 protected virtual void Dispose(bool disposing)
60 {
61 if (!_disposed)
62 {
63 if (_mouseHandle != IntPtr.Zero)
64 {
65 WindowsHookHelper.UnhookWindowsHookEx(_mouseHandle);
66 }
67  
68 _disposed = true;
69 }
70 }
71  
72 ~MouseInput()
73 {
74 Dispose(false);
75 }
76  
77 #endregion
78  
79 #region Private Methods
80  
81 private IntPtr MouseHookDelegate(int code, IntPtr wParam, IntPtr lParam)
82 {
83 if (code < 0)
84 {
85 return WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
86 }
87  
88 switch ((WindowsHookHelper.WM) wParam)
89 {
90 case WindowsHookHelper.WM.LBUTTONDOWN:
91 case WindowsHookHelper.WM.LBUTTONUP:
92 case WindowsHookHelper.WM.LBUTTONDBLCLK:
93 case WindowsHookHelper.WM.RBUTTONDOWN:
94 case WindowsHookHelper.WM.RBUTTONUP:
95 case WindowsHookHelper.WM.RBUTTONDBLCLK:
96 case WindowsHookHelper.WM.MBUTTONDOWN:
97 case WindowsHookHelper.WM.MBUTTONUP:
98 case WindowsHookHelper.WM.MBUTTONDBLCLK:
99 MouseClicked?.BeginInvoke(this, EventArgs.Empty, ar => { }, null);
100 break;
101 case WindowsHookHelper.WM.MOUSEWHEEL:
102 case WindowsHookHelper.WM.MOUSEHWHEEL:
103 MouseWheelScrolled?.BeginInvoke(this, EventArgs.Empty, ar => { }, null);
104 break;
105 case WindowsHookHelper.WM.MOUSEMOVE:
106 if (_startMousePosition == null)
107 {
108 _startMousePosition = WindowsHookHelper.GetCursorPosition();
109 }
110  
111 _mouseMovedTimer?.Change(TimeSpan.FromSeconds(1), TimeSpan.Zero);
112 break;
113 }
114  
115 return WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
116 }
117  
118 private void MouseMovementStopped(object state)
119 {
120 _stopMousePosition = WindowsHookHelper.GetCursorPosition();
121 var distance = Distance(_startMousePosition, _stopMousePosition);
122  
123 MouseMoved?.Invoke(this, new MouseMovedEventArgs(distance));
124  
125 _startMousePosition = null;
126 }
127  
128 private static double Distance(Point? startMousePosition, Point? stopMousePosition)
129 {
130 if (startMousePosition == null || stopMousePosition == null)
131 {
132 return 0;
133 }
134  
135 var p1 = (Point) startMousePosition;
136 var p2 = (Point) stopMousePosition;
137 return Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2));
138 }
139  
140 #endregion
141 }
142 }