|
1 | | -using System.Runtime.InteropServices; |
2 | | - |
3 | | -namespace ComputerLock.Platforms; |
| 1 | +namespace ComputerLock.Platforms; |
4 | 2 | internal class MouseHook : WindowsInputHook |
5 | 3 | { |
6 | | - private int _cursorCount = 0; |
7 | | - private Random _random = new Random(); |
| 4 | + private int _cursorCount; |
| 5 | + private readonly Random _random = new(); |
8 | 6 | private bool _isAutoInput; |
9 | 7 | protected override int HookType => WinApi.WH_MOUSE_LL; |
10 | 8 |
|
@@ -65,12 +63,25 @@ public void ResetCursorState() |
65 | 63 | public void MoveAndClick() |
66 | 64 | { |
67 | 65 | _isAutoInput = true; |
68 | | - var x = _random.Next(0, 100); |
69 | | - var y = _random.Next(0, 100); |
| 66 | + if (!WinApi.GetCursorPos(out var current)) |
| 67 | + { |
| 68 | + _isAutoInput = false; |
| 69 | + return; |
| 70 | + } |
| 71 | + |
| 72 | + // 生成一个很小的偏移量,避免明显跳动 |
| 73 | + var dx = _random.Next(-2, 3); |
| 74 | + var dy = _random.Next(-2, 3); |
| 75 | + if (dx == 0 && dy == 0) |
| 76 | + { |
| 77 | + dx = 1; |
| 78 | + } |
| 79 | + |
| 80 | + var targetX = current.X + dx; |
| 81 | + var targetY = current.Y + dy; |
70 | 82 |
|
71 | | - var p = new Point(x, y); |
72 | | - WinApi.SetCursorPos((int)p.X, (int)p.Y); |
73 | | - WinApi.mouse_event(WinApi.MOUSEEVENTF_RIGHTDOWN | WinApi.MOUSEEVENTF_RIGHTUP, x, y, 0, 0); |
| 83 | + WinApi.SetCursorPos(targetX, targetY); |
| 84 | + WinApi.mouse_event(WinApi.MOUSEEVENTF_RIGHTDOWN | WinApi.MOUSEEVENTF_RIGHTUP, targetX, targetY, 0, 0); |
74 | 85 | _isAutoInput = false; |
75 | 86 | } |
76 | 87 |
|
|
0 commit comments