diff --git a/BetterGenshinImpact/Core/Config/AllConfig.cs b/BetterGenshinImpact/Core/Config/AllConfig.cs index 2fdfb32d..06b1639a 100644 --- a/BetterGenshinImpact/Core/Config/AllConfig.cs +++ b/BetterGenshinImpact/Core/Config/AllConfig.cs @@ -51,13 +51,13 @@ public partial class AllConfig : ObservableObject [ObservableProperty] private int _triggerInterval = 50; - /// - /// WGC使用位图缓存 - /// 高帧率情况下,可能会导致卡顿 - /// 云原神可能会出现黑屏 - /// - [ObservableProperty] - private bool _wgcUseBitmapCache = true; + // /// + // /// WGC使用位图缓存 + // /// 高帧率情况下,可能会导致卡顿 + // /// 云原神可能会出现黑屏 + // /// + // [ObservableProperty] + // private bool _wgcUseBitmapCache = true; /// /// 自动修复Win11下BitBlt截图方式不可用的问题 diff --git a/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTask.cs b/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTask.cs index 6adce465..b9866a89 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTask.cs @@ -121,7 +121,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing break; } - using var bitmap = TaskControl.CaptureGameBitmapNoRetry(TaskTriggerDispatcher.Instance().GameCapture); + using var bitmap = TaskControl.CaptureGameImageNoRetry(TaskTriggerDispatcher.Instance().GameCapture); if (bitmap == null) { _logger.LogWarning("截图失败"); diff --git a/BetterGenshinImpact/GameTask/CaptureContent.cs b/BetterGenshinImpact/GameTask/CaptureContent.cs index 4bec488f..c6da11f5 100644 --- a/BetterGenshinImpact/GameTask/CaptureContent.cs +++ b/BetterGenshinImpact/GameTask/CaptureContent.cs @@ -19,13 +19,13 @@ public class CaptureContent : IDisposable public ImageRegion CaptureRectArea { get; private set; } - public CaptureContent(Mat srcBitmap, int frameIndex, double interval) + public CaptureContent(Mat image, int frameIndex, double interval) { FrameIndex = frameIndex; TimerInterval = interval; var systemInfo = TaskContext.Instance().SystemInfo; - var gameCaptureRegion = systemInfo.DesktopRectArea.Derive(srcBitmap, systemInfo.CaptureAreaRect.X, systemInfo.CaptureAreaRect.Y); + var gameCaptureRegion = systemInfo.DesktopRectArea.Derive(image, systemInfo.CaptureAreaRect.X, systemInfo.CaptureAreaRect.Y); CaptureRectArea = gameCaptureRegion.DeriveTo1080P(); } @@ -42,4 +42,4 @@ public class CaptureContent : IDisposable { CaptureRectArea.Dispose(); } -} +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/Common/TaskControl.cs b/BetterGenshinImpact/GameTask/Common/TaskControl.cs index 577d7270..8ca354f2 100644 --- a/BetterGenshinImpact/GameTask/Common/TaskControl.cs +++ b/BetterGenshinImpact/GameTask/Common/TaskControl.cs @@ -17,8 +17,6 @@ public class TaskControl public static ILogger Logger { get; } = App.GetLogger(); public static readonly SemaphoreSlim TaskSemaphore = new(1, 1); - - public static void CheckAndSleep(int millisecondsTimeout) @@ -178,29 +176,19 @@ public class TaskControl } } - public static Mat CaptureGameBitmap(IGameCapture? gameCapture) + public static Mat CaptureGameImage(IGameCapture? gameCapture) { - var bitmap = gameCapture?.Capture(); - // wgc 缓冲区设置的2 所以至少截图3次 - if (gameCapture?.Mode == CaptureModes.WindowsGraphicsCapture) - { - for (int i = 0; i < 2; i++) - { - bitmap = gameCapture?.Capture(); - Sleep(50); - } - } - - if (bitmap == null) + var image = gameCapture?.Capture(); + if (image == null) { Logger.LogWarning("截图失败!"); - // 重试5次 - for (var i = 0; i < 5; i++) + // 重试3次 + for (var i = 0; i < 3; i++) { - bitmap = gameCapture?.Capture(); - if (bitmap != null) + image = gameCapture?.Capture(); + if (image != null) { - return bitmap; + return image; } Sleep(30); @@ -210,56 +198,23 @@ public class TaskControl } else { - return bitmap; + return image; } } - public static Mat? CaptureGameBitmapNoRetry(IGameCapture? gameCapture) + public static Mat? CaptureGameImageNoRetry(IGameCapture? gameCapture) { return gameCapture?.Capture(); } - // private static CaptureContent CaptureToContent(IGameCapture? gameCapture) - // { - // var bitmap = CaptureGameBitmap(gameCapture); - // return new CaptureContent(bitmap, 0, 0); - // } - // - // public static CaptureContent CaptureToContent() - // { - // return CaptureToContent(TaskTriggerDispatcher.GlobalGameCapture); - // } - - // public static ImageRegion CaptureToRectArea() - // { - // return CaptureToContent(TaskTriggerDispatcher.GlobalGameCapture).CaptureRectArea; - // } - - // /// - // /// 此方法 TaskDispatcher至少处于 DispatcherCaptureModeEnum.CacheCaptureWithTrigger 状态才能使用 - // /// - // /// - // [Obsolete] - // public static CaptureContent GetContentFromDispatcher() - // { - // return TaskTriggerDispatcher.Instance().GetLastCaptureContent(); - // } - - // /// - // /// 此方法 TaskDispatcher至少处于 DispatcherCaptureModeEnum.CacheCaptureWithTrigger 状态才能使用 - // /// - // /// - // public static ImageRegion GetRectAreaFromDispatcher() - // { - // return TaskTriggerDispatcher.Instance().GetLastCaptureContent().CaptureRectArea; - // } - /// /// 自动判断当前运行上下文中截图方式,并选择合适的截图方式返回 /// /// public static ImageRegion CaptureToRectArea(bool forceNew = false) { - return TaskTriggerDispatcher.Instance().CaptureToRectArea(forceNew); + var image =CaptureGameImage(TaskTriggerDispatcher.GlobalGameCapture); + var content = new CaptureContent(image, 0, 0); + return content.CaptureRectArea; } } diff --git a/BetterGenshinImpact/GameTask/Model/Enum/DispatcherTimerOperationEnum.cs b/BetterGenshinImpact/GameTask/Model/Enum/DispatcherTimerOperationEnum.cs index 2a3033a9..02860488 100644 --- a/BetterGenshinImpact/GameTask/Model/Enum/DispatcherTimerOperationEnum.cs +++ b/BetterGenshinImpact/GameTask/Model/Enum/DispatcherTimerOperationEnum.cs @@ -1,24 +1,24 @@ -namespace BetterGenshinImpact.GameTask.Model.Enum; - -/// -/// 存在触发器运行的情况下,优先使用触发器的缓存图像 -/// 此枚举会影响调度器使用的 DispatcherCaptureModeEnum 模式 -/// -public enum DispatcherTimerOperationEnum -{ - // 关闭实时触发器,自己主动获取图像 - UseSelfCaptureImage, - - // 使用实时触发器的缓存图模式,但是不执行触发器 - UseCacheImage, - - // 使用实时触发器的缓存图模式,并执行触发器 - UseCacheImageWithTrigger, - - // 使用实时触发器的缓存图模式,并清空当前已有触发器,执行触发器 - // 清空触发器是为了让js脚本手动添加触发器 - UseCacheImageWithTriggerEmpty, - - // 不做任何操作 - None -} +// namespace BetterGenshinImpact.GameTask.Model.Enum; +// +// /// +// /// 存在触发器运行的情况下,优先使用触发器的缓存图像 +// /// 此枚举会影响调度器使用的 DispatcherCaptureModeEnum 模式 +// /// +// public enum DispatcherTimerOperationEnum +// { +// // 关闭实时触发器,自己主动获取图像 +// UseSelfCaptureImage, +// +// // 使用实时触发器的缓存图模式,但是不执行触发器 +// UseCacheImage, +// +// // 使用实时触发器的缓存图模式,并执行触发器 +// UseCacheImageWithTrigger, +// +// // 使用实时触发器的缓存图模式,并清空当前已有触发器,执行触发器 +// // 清空触发器是为了让js脚本手动添加触发器 +// UseCacheImageWithTriggerEmpty, +// +// // 不做任何操作 +// None +// } diff --git a/BetterGenshinImpact/GameTask/TaskRunner.cs b/BetterGenshinImpact/GameTask/TaskRunner.cs index 6662c1d7..413861e0 100644 --- a/BetterGenshinImpact/GameTask/TaskRunner.cs +++ b/BetterGenshinImpact/GameTask/TaskRunner.cs @@ -23,7 +23,7 @@ public class TaskRunner { private readonly ILogger _logger = App.GetLogger(); - private readonly DispatcherTimerOperationEnum _timerOperation = DispatcherTimerOperationEnum.None; + // private readonly DispatcherTimerOperationEnum _timerOperation = DispatcherTimerOperationEnum.None; private readonly string _name = string.Empty; @@ -31,11 +31,11 @@ public class TaskRunner { } - public TaskRunner(DispatcherTimerOperationEnum timerOperation) - { - _timerOperation = timerOperation; - } - + // public TaskRunner(DispatcherTimerOperationEnum timerOperation) + // { + // _timerOperation = timerOperation; + // } + /// /// 加锁并独立运行任务 /// @@ -134,27 +134,27 @@ public class TaskRunner var maskWindow = MaskWindow.Instance(); SystemControl.ActivateWindow(); maskWindow.Invoke(maskWindow.Show); - if (_timerOperation == DispatcherTimerOperationEnum.UseSelfCaptureImage) - { - Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待日志窗口被激活 - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.Stop); - } - else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImage) - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.OnlyCacheCapture); - Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 - } - else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTrigger) - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); - Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 - } - else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); - TaskTriggerDispatcher.Instance().ClearTriggers(); - Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 - } + // if (_timerOperation == DispatcherTimerOperationEnum.UseSelfCaptureImage) + // { + // Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待日志窗口被激活 + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.Stop); + // } + // else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImage) + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.OnlyCacheCapture); + // Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 + // } + // else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTrigger) + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); + // Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 + // } + // else if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); + // TaskTriggerDispatcher.Instance().ClearTriggers(); + // Thread.Sleep(TaskContext.Instance().Config.TriggerInterval * 5); // 等待缓存图像 + // } } public void End() @@ -165,27 +165,27 @@ public class TaskRunner } VisionContext.Instance().DrawContent.ClearAll(); - if (_timerOperation == DispatcherTimerOperationEnum.UseSelfCaptureImage) - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.Start); - } - else if (_timerOperation is DispatcherTimerOperationEnum.UseCacheImage or DispatcherTimerOperationEnum.UseCacheImageWithTrigger or DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) - { - // 还原到原来的模式 - if (TaskContext.Instance().Config.CommonConfig.ScreenshotEnabled || TaskContext.Instance().Config.MacroConfig.CombatMacroEnabled) - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); - } - else - { - TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.NormalTrigger); - } - - if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) - { - TaskTriggerDispatcher.Instance().SetTriggers(GameTaskManager.LoadInitialTriggers()); - } - } + // if (_timerOperation == DispatcherTimerOperationEnum.UseSelfCaptureImage) + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.Start); + // } + // else if (_timerOperation is DispatcherTimerOperationEnum.UseCacheImage or DispatcherTimerOperationEnum.UseCacheImageWithTrigger or DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) + // { + // // 还原到原来的模式 + // if (TaskContext.Instance().Config.CommonConfig.ScreenshotEnabled || TaskContext.Instance().Config.MacroConfig.CombatMacroEnabled) + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger); + // } + // else + // { + // TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.NormalTrigger); + // } + // + // if (_timerOperation == DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty) + // { + // TaskTriggerDispatcher.Instance().SetTriggers(GameTaskManager.LoadInitialTriggers()); + // } + // } } } diff --git a/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs b/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs index 684c4e37..512bf0f2 100644 --- a/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs +++ b/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs @@ -1,31 +1,17 @@ using BetterGenshinImpact.Core.Config; -using BetterGenshinImpact.GameTask.AutoDomain; -using BetterGenshinImpact.GameTask.AutoFight; -using BetterGenshinImpact.GameTask.AutoGeniusInvokation; -using BetterGenshinImpact.GameTask.AutoMusicGame; -using BetterGenshinImpact.GameTask.AutoSkip; -using BetterGenshinImpact.GameTask.AutoSkip.Model; -using BetterGenshinImpact.GameTask.AutoTrackPath; -using BetterGenshinImpact.GameTask.AutoWood; using BetterGenshinImpact.GameTask.Common; -using BetterGenshinImpact.GameTask.Model; -using BetterGenshinImpact.GameTask.Model.Area; using BetterGenshinImpact.GameTask.Model.Enum; using BetterGenshinImpact.Helpers; using BetterGenshinImpact.View; using Fischless.GameCapture; using Microsoft.Extensions.Logging; using OpenCvSharp; -using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Threading; -using System.Threading.Tasks; using Vanara.PInvoke; namespace BetterGenshinImpact.GameTask @@ -49,11 +35,6 @@ namespace BetterGenshinImpact.GameTask private DateTime _prevManualGc = DateTime.MinValue; - /// - /// 捕获结果队列 - /// - private Bitmap _bitmap = new(10, 10); - /// /// 调度器捕获模式, 影响以下内容: /// 1. 是否缓存图像 @@ -61,7 +42,6 @@ namespace BetterGenshinImpact.GameTask /// private DispatcherCaptureModeEnum _dispatcherCacheCaptureMode = DispatcherCaptureModeEnum.NormalTrigger; - private static readonly object _bitmapLocker = new(); private static readonly object _triggerListLocker = new(); public event EventHandler? UiTaskStopTickEvent; @@ -143,7 +123,6 @@ namespace BetterGenshinImpact.GameTask GameCapture.Start(hWnd, new Dictionary() { - { "useBitmapCache", TaskContext.Instance().Config.WgcUseBitmapCache }, { "autoFixWin11BitBlt", OsVersionHelper.IsWindows11_OrGreater && TaskContext.Instance().Config.AutoFixWin11BitBlt } } ); @@ -187,11 +166,6 @@ namespace BetterGenshinImpact.GameTask } } - public System.Timers.Timer GetTimer() - { - return _timer; - } - public void Dispose() { Stop(); @@ -305,10 +279,9 @@ namespace BetterGenshinImpact.GameTask // 帧序号自增 1分钟后归零(MaxFrameIndexSecond) _frameIndex = (_frameIndex + 1) % (int)(CaptureContent.MaxFrameIndexSecond * 1000d / _timer.Interval); - if (_dispatcherCacheCaptureMode == DispatcherCaptureModeEnum.NormalTrigger - && (_triggers == null || !_triggers.Exists(t => t.IsEnabled))) + if (_triggers == null || !_triggers.Exists(t => t.IsEnabled)) { - // Debug.WriteLine("没有可用的触发器且不处于仅截屏状态, 不再进行截屏"); + Debug.WriteLine("没有可用的触发器且不处于仅截屏状态, 不再进行截屏"); return; } @@ -323,11 +296,6 @@ namespace BetterGenshinImpact.GameTask return; } - // if (IsOnlyCacheCapture(bitmap)) - // { - // return; - // } - // 循环执行所有触发器 有独占状态的触发器的时候只执行独占触发器 var content = new CaptureContent(bitmap, _frameIndex, _timer.Interval); @@ -410,43 +378,21 @@ namespace BetterGenshinImpact.GameTask { return rect.Width == 0 || rect.Height == 0; } - - /// - /// 是否仅缓存截图 - /// - /// - /// - private bool IsOnlyCacheCapture(Bitmap bitmap) - { - lock (_bitmapLocker) - { - if (_dispatcherCacheCaptureMode is DispatcherCaptureModeEnum.OnlyCacheCapture or DispatcherCaptureModeEnum.CacheCaptureWithTrigger) - { - _bitmap = new Bitmap(bitmap); - if (_dispatcherCacheCaptureMode == DispatcherCaptureModeEnum.OnlyCacheCapture) - { - return true; - } - } - - return false; - } - } - + public void SetCacheCaptureMode(DispatcherCaptureModeEnum mode) { - if (mode is DispatcherCaptureModeEnum.Start) - { - this.StartTimer(); - } - else if (mode is DispatcherCaptureModeEnum.Stop) - { - this.StopTimer(); - } - else - { - _dispatcherCacheCaptureMode = mode; - } + // if (mode is DispatcherCaptureModeEnum.Start) + // { + // this.StartTimer(); + // } + // else if (mode is DispatcherCaptureModeEnum.Stop) + // { + // this.StopTimer(); + // } + // else + // { + // _dispatcherCacheCaptureMode = mode; + // } } public DispatcherCaptureModeEnum GetCacheCaptureMode() @@ -454,73 +400,37 @@ namespace BetterGenshinImpact.GameTask return _dispatcherCacheCaptureMode; } - // public Bitmap GetLastCaptureBitmap() - // { - // lock (_bitmapLocker) - // { - // return new Bitmap(_bitmap); - // } - // } - - public CaptureContent GetLastCaptureContent() - { - var bitmap = TaskControl.CaptureGameBitmap(GameCapture); - return new CaptureContent(bitmap, _frameIndex, _timer.Interval); - } - - public ImageRegion CaptureToRectArea(bool forceNew = false) - { - // 触发器启动的情况下优先使用触发器的截图 - if (!forceNew && _timer.Enabled && _dispatcherCacheCaptureMode is DispatcherCaptureModeEnum.OnlyCacheCapture or DispatcherCaptureModeEnum.CacheCaptureWithTrigger) - { - return GetLastCaptureContent().CaptureRectArea; - } - else - { - var bitmap = TaskControl.CaptureGameBitmap(GameCapture); - var content = new CaptureContent(bitmap, 0, 0); - return content.CaptureRectArea; - } - } - public void TakeScreenshot() { - if (_dispatcherCacheCaptureMode is DispatcherCaptureModeEnum.OnlyCacheCapture or DispatcherCaptureModeEnum.CacheCaptureWithTrigger) + try { - try + var path = Global.Absolute($@"log\screenshot\"); + if (!Directory.Exists(path)) { - var path = Global.Absolute($@"log\screenshot\"); - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - - var bitmap = TaskControl.CaptureGameBitmap(GameCapture); - var name = $@"{DateTime.Now:yyyyMMddHHmmssffff}.png"; - var savePath = Global.Absolute($@"log\screenshot\{name}"); - - if (TaskContext.Instance().Config.CommonConfig.ScreenshotUidCoverEnabled) - { - var rect = TaskContext.Instance().Config.MaskWindowConfig.UidCoverRect; - bitmap.Rectangle(rect, Scalar.White, -1); - Cv2.ImWrite(savePath, bitmap); - } - else - { - Cv2.ImWrite(savePath, bitmap); - } - - _logger.LogInformation("截图已保存: {Name}", name); + Directory.CreateDirectory(path); } - catch (Exception e) + + var bitmap = TaskControl.CaptureGameImage(GameCapture); + var name = $@"{DateTime.Now:yyyyMMddHHmmssffff}.png"; + var savePath = Global.Absolute($@"log\screenshot\{name}"); + + if (TaskContext.Instance().Config.CommonConfig.ScreenshotUidCoverEnabled) { - _logger.LogError("截图保存失败: {Message}", e.Message); - _logger.LogDebug("截图保存失败: {StackTrace}", e.StackTrace); + var rect = TaskContext.Instance().Config.MaskWindowConfig.UidCoverRect; + bitmap.Rectangle(rect, Scalar.White, -1); + Cv2.ImWrite(savePath, bitmap); } + else + { + Cv2.ImWrite(savePath, bitmap); + } + + _logger.LogInformation("截图已保存: {Name}", name); } - else + catch (Exception e) { - _logger.LogWarning("当前不处于截图模式,无法保存截图"); + _logger.LogError("截图保存失败: {Message}", e.Message); + _logger.LogDebug("截图保存失败: {StackTrace}", e.StackTrace); } } } diff --git a/BetterGenshinImpact/Service/Notification/NotificationService.cs b/BetterGenshinImpact/Service/Notification/NotificationService.cs index d6e18df9..22c2025e 100644 --- a/BetterGenshinImpact/Service/Notification/NotificationService.cs +++ b/BetterGenshinImpact/Service/Notification/NotificationService.cs @@ -164,7 +164,7 @@ public class NotificationService : IHostedService { if (TaskContext.Instance().Config.NotificationConfig.IncludeScreenShot) { - var bitmap = TaskControl.CaptureGameBitmapNoRetry(TaskTriggerDispatcher.GlobalGameCapture); + var bitmap = TaskControl.CaptureGameImageNoRetry(TaskTriggerDispatcher.GlobalGameCapture); if (bitmap != null) { notificationData.Screenshot = bitmap.ToBitmap(); diff --git a/BetterGenshinImpact/Service/ScriptService.cs b/BetterGenshinImpact/Service/ScriptService.cs index e22a65cf..6f029736 100644 --- a/BetterGenshinImpact/Service/ScriptService.cs +++ b/BetterGenshinImpact/Service/ScriptService.cs @@ -23,6 +23,7 @@ namespace BetterGenshinImpact.Service; public partial class ScriptService : IScriptService { private readonly ILogger _logger = App.GetLogger(); + private static bool IsCurrentHourEqual(string input) { // 尝试将输入字符串转换为整数 @@ -41,52 +42,51 @@ public partial class ScriptService : IScriptService // 如果输入非数字或不合法,返回 false return false; } + public async Task RunMulti(IEnumerable projectList, string? groupName = null) { groupName ??= "默认"; - var hasTimer = false; - var list = ReloadScriptProjects(projectList, ref hasTimer); + var list = ReloadScriptProjects(projectList); - // 针对JS 脚本,检查是否包含定时器操作 - var jsProjects = ExtractJsProjects(list); - if (!hasTimer && jsProjects.Count > 0) - { - var codeList = await ReadCodeList(jsProjects); - hasTimer = HasTimerOperation(codeList); - } + // // 针对JS 脚本,检查是否包含定时器操作 + // var jsProjects = ExtractJsProjects(list); + // if (!hasTimer && jsProjects.Count > 0) + // { + // var codeList = await ReadCodeList(jsProjects); + // hasTimer = HasTimerOperation(codeList); + // } // 没启动时候,启动截图器 await StartGameTask(); if (!string.IsNullOrEmpty(groupName)) { - if (hasTimer) - { - _logger.LogInformation("配置组 {Name} 包含实时任务操作调用", groupName); - } + // if (hasTimer) + // { + // _logger.LogInformation("配置组 {Name} 包含实时任务操作调用", groupName); + // } _logger.LogInformation("配置组 {Name} 加载完成,共{Cnt}个脚本,开始执行", groupName, list.Count); } - var timerOperation = hasTimer ? DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty : DispatcherTimerOperationEnum.UseSelfCaptureImage; - + // var timerOperation = hasTimer ? DispatcherTimerOperationEnum.UseCacheImageWithTriggerEmpty : DispatcherTimerOperationEnum.UseSelfCaptureImage; + Notify.Event(NotificationEvent.GroupStart).Success($"配置组{groupName}启动"); - - await new TaskRunner(timerOperation) + + await new TaskRunner() .RunThreadAsync(async () => { var stopwatch = new Stopwatch(); foreach (var project in list) { - if (project.GroupInfo is { Config.PathingConfig.Enabled: true } && IsCurrentHourEqual(project.GroupInfo.Config.PathingConfig.SkipDuring)) { _logger.LogInformation($"{project.Name}任务已到禁止执行时段,将跳过!"); continue; } - + if (project.Status != "Enabled") { _logger.LogInformation("脚本 {Name} 状态为禁用,跳过执行", project.Name); @@ -103,24 +103,21 @@ public partial class ScriptService : IScriptService { try { - if (hasTimer) - { - TaskTriggerDispatcher.Instance().ClearTriggers(); - } + TaskTriggerDispatcher.Instance().ClearTriggers(); + _logger.LogInformation("------------------------------"); stopwatch.Reset(); stopwatch.Start(); await ExecuteProject(project); - + //多次执行时及时中断 if (project.GroupInfo is { Config.PathingConfig.Enabled: true } && IsCurrentHourEqual(project.GroupInfo.Config.PathingConfig.SkipDuring)) { _logger.LogInformation($"{project.Name}任务已到禁止执行时段,将跳过!"); break; } - } catch (NormalEndException e) { @@ -144,7 +141,6 @@ public partial class ScriptService : IScriptService _logger.LogInformation("→ 脚本执行结束: {Name}, 耗时: {Minutes}分{Seconds:0.000}秒", project.Name, elapsedTime.Hours * 60 + elapsedTime.Minutes, elapsedTime.TotalSeconds % 60); _logger.LogInformation("------------------------------"); - } await Task.Delay(2000); @@ -152,14 +148,18 @@ public partial class ScriptService : IScriptService } }); + // 还原定时器 + TaskTriggerDispatcher.Instance().SetTriggers(GameTaskManager.LoadInitialTriggers()); + if (!string.IsNullOrEmpty(groupName)) { _logger.LogInformation("配置组 {Name} 执行结束", groupName); } + Notify.Event(NotificationEvent.GroupEnd).Success($"配置组{groupName}结束"); } - private List ReloadScriptProjects(IEnumerable projectList, ref bool hasTimer) + private List ReloadScriptProjects(IEnumerable projectList) { var list = new List(); foreach (var project in projectList) @@ -181,14 +181,14 @@ public partial class ScriptService : IScriptService var newProject = ScriptGroupProject.BuildPathingProject(project.Name, project.FolderName); CopyProjectProperties(project, newProject); list.Add(newProject); - hasTimer = true; + // hasTimer = true; } else if (project.Type == "Shell") { var newProject = ScriptGroupProject.BuildShellProject(project.Name); CopyProjectProperties(project, newProject); list.Add(newProject); - hasTimer = true; + // hasTimer = true; } } @@ -204,23 +204,22 @@ public partial class ScriptService : IScriptService target.GroupInfo = source.GroupInfo; } - private List ExtractJsProjects(List list) - { - var jsProjects = new List(); - foreach (var project in list) - { - if (project is { Type: "Javascript", Project: not null }) - { - jsProjects.Add(project.Project); - } - } - - return jsProjects; - } + // private List ExtractJsProjects(List list) + // { + // var jsProjects = new List(); + // foreach (var project in list) + // { + // if (project is { Type: "Javascript", Project: not null }) + // { + // jsProjects.Add(project.Project); + // } + // } + // + // return jsProjects; + // } private async Task ExecuteProject(ScriptGroupProject project) { - if (project.Type == "Javascript") { if (project.Project == null) @@ -241,7 +240,8 @@ public partial class ScriptService : IScriptService _logger.LogInformation("→ 开始执行地图追踪任务: {Name}", project.Name); await project.Run(); } - else if (project.Type == "Shell"){ + else if (project.Type == "Shell") + { _logger.LogInformation("→ 开始执行shell: {Name}", project.Name); await project.Run(); } diff --git a/BetterGenshinImpact/View/CaptureTestWindow.xaml.cs b/BetterGenshinImpact/View/CaptureTestWindow.xaml.cs index 04dd18a5..5ab0fdde 100644 --- a/BetterGenshinImpact/View/CaptureTestWindow.xaml.cs +++ b/BetterGenshinImpact/View/CaptureTestWindow.xaml.cs @@ -50,7 +50,6 @@ public partial class CaptureTestWindow : Window _capture.Start(hWnd, new Dictionary() { - { "useBitmapCache", TaskContext.Instance().Config.WgcUseBitmapCache }, { "autoFixWin11BitBlt", OsVersionHelper.IsWindows11 && TaskContext.Instance().Config.AutoFixWin11BitBlt } } ); diff --git a/BetterGenshinImpact/View/Pages/HomePage.xaml b/BetterGenshinImpact/View/Pages/HomePage.xaml index 90053173..d2c156a7 100644 --- a/BetterGenshinImpact/View/Pages/HomePage.xaml +++ b/BetterGenshinImpact/View/Pages/HomePage.xaml @@ -176,7 +176,7 @@ Margin="0,0,36,0" Text="{Binding Config.TriggerInterval, Mode=TwoWay}" /> - + diff --git a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs index 52206e70..9d56006b 100644 --- a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs @@ -125,7 +125,7 @@ public partial class KeyMouseRecordPageViewModel : ViewModel { var s = await File.ReadAllTextAsync(path); - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunThreadAsync(async () => await KeyMouseMacroPlayer.PlayMacro(s, CancellationContext.Instance.Cts.Token)); } catch (Exception e) diff --git a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs index f4c01070..e2d1c049 100644 --- a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs @@ -213,7 +213,7 @@ public partial class OneDragonFlowViewModel : ViewModel // 没启动的时候先启动 await ScriptService.StartGameTask(); - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunThreadAsync(async () => { Notify.Event(NotificationEvent.DragonStart).Success("一条龙启动"); diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index af7e7409..e175b2c2 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -183,7 +183,7 @@ public partial class TaskSettingsPageViewModel : ViewModel } SwitchAutoGeniusInvokationEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoGeniusInvokationTask(new GeniusInvokationTaskParam(content))); SwitchAutoGeniusInvokationEnabled = false; } @@ -219,7 +219,7 @@ public partial class TaskSettingsPageViewModel : ViewModel public async Task OnSwitchAutoWood() { SwitchAutoWoodEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoWoodTask(new WoodTaskParam(AutoWoodRoundNum, AutoWoodDailyMaxCount))); SwitchAutoWoodEnabled = false; } @@ -241,7 +241,7 @@ public partial class TaskSettingsPageViewModel : ViewModel var param = new AutoFightParam(path, Config.AutoFightConfig); SwitchAutoFightEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseCacheImageWithTrigger) + await new TaskRunner() .RunSoloTaskAsync(new AutoFightTask(param)); SwitchAutoFightEnabled = false; } @@ -261,7 +261,7 @@ public partial class TaskSettingsPageViewModel : ViewModel } SwitchAutoDomainEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseCacheImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoDomainTask(new AutoDomainParam(AutoDomainRoundNum, path))); SwitchAutoDomainEnabled = false; } @@ -376,7 +376,7 @@ public partial class TaskSettingsPageViewModel : ViewModel private async Task OnSwitchAutoMusicGame() { SwitchAutoMusicGameEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoMusicGameTask(new AutoMusicGameParam())); SwitchAutoMusicGameEnabled = false; } @@ -391,7 +391,7 @@ public partial class TaskSettingsPageViewModel : ViewModel private async Task OnSwitchAutoAlbum() { SwitchAutoAlbumEnabled = true; - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoAlbumTask(new AutoMusicGameParam())); SwitchAutoAlbumEnabled = false; } @@ -401,7 +401,7 @@ public partial class TaskSettingsPageViewModel : ViewModel { SwitchAutoFishingEnabled = true; var param = AutoFishingTaskParam.BuildFromConfig(TaskContext.Instance().Config.AutoFishingConfig, SaveScreenshotOnKeyTick); - await new TaskRunner(DispatcherTimerOperationEnum.UseSelfCaptureImage) + await new TaskRunner() .RunSoloTaskAsync(new AutoFishingTask(param)); SwitchAutoFishingEnabled = false; }