12 private readonly Control _control;
13 private readonly HashSet<MouseButton> _pressed =
new();
14 private readonly
object _pressedLock =
new();
15 private Point _currentPosition;
17 private int _scrollDelta;
39 var osButtons = Control.MouseButtons;
42 if (!osButtons.HasFlag(MouseButtons.Left)) _pressed.Remove(
MouseButton.Left);
43 if (!osButtons.HasFlag(MouseButtons.Right)) _pressed.Remove(
MouseButton.Right);
44 if (!osButtons.HasFlag(MouseButtons.Middle)) _pressed.Remove(
MouseButton.Middle);
45 return new HashSet<MouseButton>(_pressed);
58 public int ScrollDelta => Interlocked.Exchange(ref _scrollDelta, 0);
67 _control = control ??
throw new ArgumentNullException(nameof(control));
69 _control.MouseDown += OnMouseDown;
70 _control.MouseUp += OnMouseUp;
71 _control.MouseMove += OnMouseMove;
72 _control.MouseWheel += OnMouseWheel;
75 private void OnMouseDown(
object? sender, System.Windows.Forms.MouseEventArgs e)
78 _pressed.Add(MapButton(e.Button));
82 private void OnMouseUp(
object? sender, System.Windows.Forms.MouseEventArgs e)
85 _pressed.Remove(MapButton(e.Button));
89 private void OnMouseMove(
object? sender, System.Windows.Forms.MouseEventArgs e)
94 private void UpdatePosition(System.Windows.Forms.MouseEventArgs e)
96 _currentPosition = e.Location;
104 private static MouseButton MapButton(MouseButtons btn) => btn
switch
112 private void OnMouseWheel(
object? sender, System.Windows.Forms.MouseEventArgs e)
114 Interlocked.Add(ref _scrollDelta, e.Delta);
120 _control.MouseDown -= OnMouseDown;
121 _control.MouseUp -= OnMouseUp;
122 _control.MouseMove -= OnMouseMove;
123 _control.MouseWheel -= OnMouseWheel;
Point AdapterPxToScreenPx(PointF adapterPx)
Converts adapter input to logical ScreenPx, retaining outside coordinates for capture/leave.