From d5d65b7820d901cd3e19255c2caa542266df7138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 20 Dec 2024 02:52:00 +0800 Subject: [PATCH] use system tick count instead of DateTime --- .../Core/Monitor/DirectInputMonitor.cs | 7 +++-- .../Core/Monitor/MouseKeyMonitor.cs | 4 +-- .../Core/Recorder/GlobalKeyMouseRecord.cs | 12 ++++----- .../Core/Recorder/KeyMouseMacroPlayer.cs | 6 ++--- .../Core/Recorder/KeyMouseRecorder.cs | 27 ++++++++++--------- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/BetterGenshinImpact/Core/Monitor/DirectInputMonitor.cs b/BetterGenshinImpact/Core/Monitor/DirectInputMonitor.cs index d77956fd..f07907c1 100644 --- a/BetterGenshinImpact/Core/Monitor/DirectInputMonitor.cs +++ b/BetterGenshinImpact/Core/Monitor/DirectInputMonitor.cs @@ -3,6 +3,7 @@ using SharpDX.DirectInput; using System; using System.Threading; using System.Threading.Tasks; +using Vanara.PInvoke; namespace BetterGenshinImpact.Core.Monitor; @@ -11,6 +12,8 @@ public class DirectInputMonitor : IDisposable private bool _isRunning = true; private readonly Mouse _mouse; + + public static int Interval = 5; public DirectInputMonitor() { @@ -34,8 +37,8 @@ public class DirectInputMonitor : IDisposable _mouse.Acquire(); MouseState state = _mouse.GetCurrentState(); // Debug.WriteLine($"{state.X} {state.Y} {state.Buttons[0]} {state.Buttons[1]}"); - GlobalKeyMouseRecord.Instance.GlobalHookMouseMoveBy(state); - Thread.Sleep(5); // 10ms, equivalent to CLOCKS_PER_SEC/100 + GlobalKeyMouseRecord.Instance.GlobalHookMouseMoveBy(state, Kernel32.GetTickCount()); + Thread.Sleep(Interval); // 10ms, equivalent to CLOCKS_PER_SEC/100 } }); } diff --git a/BetterGenshinImpact/Core/Monitor/MouseKeyMonitor.cs b/BetterGenshinImpact/Core/Monitor/MouseKeyMonitor.cs index 40e81464..d5f5c379 100644 --- a/BetterGenshinImpact/Core/Monitor/MouseKeyMonitor.cs +++ b/BetterGenshinImpact/Core/Monitor/MouseKeyMonitor.cs @@ -62,7 +62,7 @@ public class MouseKeyMonitor private void GlobalHookKeyDown(object? sender, KeyEventArgs e) { // Debug.WriteLine("KeyDown: \t{0}", e.KeyCode); - GlobalKeyMouseRecord.Instance.GlobalHookKeyDown(e); + GlobalKeyMouseRecord.Instance.GlobalHookKeyDown(e, Kernel32.GetTickCount()); // 热键按下事件 HotKeyDown(sender, e); @@ -100,7 +100,7 @@ public class MouseKeyMonitor private void GlobalHookKeyUp(object? sender, KeyEventArgs e) { // Debug.WriteLine("KeyUp: \t{0}", e.KeyCode); - GlobalKeyMouseRecord.Instance.GlobalHookKeyUp(e); + GlobalKeyMouseRecord.Instance.GlobalHookKeyUp(e, Kernel32.GetTickCount()); // 热键松开事件 HotKeyUp(sender, e); diff --git a/BetterGenshinImpact/Core/Recorder/GlobalKeyMouseRecord.cs b/BetterGenshinImpact/Core/Recorder/GlobalKeyMouseRecord.cs index 8703b1d5..2f29ee2a 100644 --- a/BetterGenshinImpact/Core/Recorder/GlobalKeyMouseRecord.cs +++ b/BetterGenshinImpact/Core/Recorder/GlobalKeyMouseRecord.cs @@ -115,7 +115,7 @@ public class GlobalKeyMouseRecord : Singleton ra.Dispose(); } - public void GlobalHookKeyDown(KeyEventArgs e) + public void GlobalHookKeyDown(KeyEventArgs e, uint time) { // 排除热键 if (e.KeyCode.ToString() == TaskContext.Instance().Config.HotKeyConfig.KeyMouseMacroRecordHotkey) @@ -139,10 +139,10 @@ public class GlobalKeyMouseRecord : Singleton _keyDownState.Add(e.KeyCode, true); } // Debug.WriteLine($"KeyDown: {e.KeyCode}"); - _recorder?.KeyDown(e); + _recorder?.KeyDown(e, time); } - public void GlobalHookKeyUp(KeyEventArgs e) + public void GlobalHookKeyUp(KeyEventArgs e, uint time) { if (e.KeyCode.ToString() == TaskContext.Instance().Config.HotKeyConfig.Test1Hotkey) { @@ -153,7 +153,7 @@ public class GlobalKeyMouseRecord : Singleton { // Debug.WriteLine($"KeyUp: {e.KeyCode}"); _keyDownState[e.KeyCode] = false; - _recorder?.KeyUp(e); + _recorder?.KeyUp(e, time); } } @@ -185,14 +185,14 @@ public class GlobalKeyMouseRecord : Singleton _recorder?.MouseWheel(e); } - public void GlobalHookMouseMoveBy(MouseState state) + public void GlobalHookMouseMoveBy(MouseState state, uint time) { if (state is { X: 0, Y: 0 } || !_isInMainUi) { return; } // Debug.WriteLine($"MouseMoveBy: {state.X}, {state.Y}"); - _recorder?.MouseMoveBy(state); + _recorder?.MouseMoveBy(state, time); } } diff --git a/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs b/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs index 5d8ca5d0..32164d89 100644 --- a/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs +++ b/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs @@ -49,7 +49,7 @@ public class KeyMouseMacroPlayer public static async Task PlayMacro(List macroEvents, CancellationToken ct) { WorkingArea = PrimaryScreen.WorkingArea; - var startTime = DateTime.UtcNow; + var startTime = Kernel32.GetTickCount(); foreach (var e in macroEvents) { if (ct.IsCancellationRequested) @@ -57,14 +57,14 @@ public class KeyMouseMacroPlayer return; } - var timeToWait = (int)(e.Time - (DateTime.UtcNow - startTime).TotalMilliseconds); + var timeToWait = e.Time - (Kernel32.GetTickCount() - startTime); if (timeToWait < 0) { TaskControl.Logger.LogWarning("无法原速重放事件{Event},落后{TimeToWait}ms", e.Type.ToString(), -timeToWait); } else { - await Task.Delay(timeToWait, ct); + await Task.Delay((int)timeToWait, ct); } switch (e.Type) diff --git a/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs b/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs index e468f7ee..d75a3f0a 100644 --- a/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs +++ b/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; using System.Windows.Forms; +using Vanara.PInvoke; namespace BetterGenshinImpact.Core.Recorder; @@ -16,7 +17,7 @@ public class KeyMouseRecorder { public List MacroEvents { get; } = []; - public DateTime StartTime { get; set; } = DateTime.UtcNow; + public uint StartTime { get; set; } = Kernel32.GetTickCount(); public DateTime LastOrientationDetection { get; set; } = DateTime.UtcNow; @@ -104,23 +105,23 @@ public class KeyMouseRecorder return JsonSerializer.Serialize(keyMouseScript, JsonOptions); } - public void KeyDown(KeyEventArgs e) + public void KeyDown(KeyEventArgs e, uint time) { MacroEvents.Add(new MacroEvent { Type = MacroEventType.KeyDown, KeyCode = e.KeyValue, - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = time - StartTime }); } - public void KeyUp(KeyEventArgs e) + public void KeyUp(KeyEventArgs e, uint time) { MacroEvents.Add(new MacroEvent { Type = MacroEventType.KeyUp, KeyCode = e.KeyValue, - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = time - StartTime }); } @@ -132,7 +133,7 @@ public class KeyMouseRecorder MouseX = e.X, MouseY = e.Y, MouseButton = e.Button.ToString(), - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = e.Timestamp - StartTime }); } @@ -144,7 +145,7 @@ public class KeyMouseRecorder MouseX = e.X, MouseY = e.Y, MouseButton = e.Button.ToString(), - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = e.Timestamp - StartTime }); } @@ -155,7 +156,7 @@ public class KeyMouseRecorder Type = MacroEventType.MouseMoveTo, MouseX = e.X, MouseY = e.Y, - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = e.Timestamp - StartTime }); } @@ -165,28 +166,30 @@ public class KeyMouseRecorder { Type = MacroEventType.MouseWheel, MouseY = e.Delta, // 120 的倍率 - Time = (DateTime.UtcNow - StartTime).TotalMilliseconds + Time = e.Timestamp - StartTime }); } - public void MouseMoveBy(MouseState state) + public void MouseMoveBy(MouseState state, uint time) { - var now = DateTime.UtcNow; + int? cao = null; if (TaskContext.Instance().Config.RecordConfig.IsRecordCameraOrientation) { + var now = DateTime.UtcNow; if ((now - LastOrientationDetection).TotalMilliseconds > 100.0) { LastOrientationDetection = now; cao = (int)Math.Round(CameraOrientation.Compute(TaskControl.CaptureToRectArea().SrcMat)); } } + MacroEvents.Add(new MacroEvent { Type = MacroEventType.MouseMoveBy, MouseX = state.X, MouseY = state.Y, - Time = (now - StartTime).TotalMilliseconds, + Time = time - 5, CameraOrientation = cao, }); }