From f86abe3cebe1db2457e3e11120773376b14ca79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Mon, 23 Feb 2026 13:18:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=BB=E6=84=8F=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E7=9A=84=E5=90=AF=E5=8A=A8=20(#2819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BetterGenshinImpact/GameTask/SystemControl.cs | 29 ++++++++++++---- BetterGenshinImpact/GameTask/TaskContext.cs | 34 ++++++++++++++++++- .../ViewModel/Pages/HomePageViewModel.cs | 2 +- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/BetterGenshinImpact/GameTask/SystemControl.cs b/BetterGenshinImpact/GameTask/SystemControl.cs index d87b8f50..18e16a47 100644 --- a/BetterGenshinImpact/GameTask/SystemControl.cs +++ b/BetterGenshinImpact/GameTask/SystemControl.cs @@ -13,7 +13,8 @@ public class SystemControl { public static nint FindGenshinImpactHandle() { - return FindHandleByProcessName("YuanShen", "GenshinImpact", "Genshin Impact Cloud Game", "Genshin Impact Cloud"); + var processNames = TaskContext.Instance().GetGenshinGameProcessNameList(); + return FindHandleByProcessName(processNames.ToArray()); } public static async Task StartFromLocalAsync(string path) @@ -69,7 +70,13 @@ public class SystemControl public static bool IsGenshinImpactActiveByProcess() { var name = GetActiveProcessName(); - return name is "YuanShen" or "yuanshen" or "GenshinImpact" or "Genshin Impact Cloud Game"; + if (string.IsNullOrEmpty(name)) + { + return false; + } + + var processNames = TaskContext.Instance().GetGenshinGameProcessNameList(); + return processNames.Any(p => string.Equals(p, name, StringComparison.OrdinalIgnoreCase)); } public static string GetActiveByProcess() @@ -312,11 +319,19 @@ public class SystemControl { try { - // 尝试通过进程名称查找原神进程 - var processes = Process.GetProcessesByName("YuanShen") - .Concat(Process.GetProcessesByName("GenshinImpact")) - .Concat(Process.GetProcessesByName("Genshin Impact Cloud Game")) - .ToArray(); + var processNames = TaskContext.Instance().GetGenshinGameProcessNameList(); + var allProcesses = processNames + .SelectMany(Process.GetProcessesByName) + .ToList(); + var processMap = allProcesses + .GroupBy(p => p.Id) + .ToDictionary(g => g.Key, g => g.First()); + // 释放重复的 Process 包装对象 + foreach (var p in allProcesses.Where(p => !ReferenceEquals(p, processMap[p.Id]))) + { + p.Dispose(); + } + var processes = processMap.Values.ToArray(); if (processes.Length > 0) { diff --git a/BetterGenshinImpact/GameTask/TaskContext.cs b/BetterGenshinImpact/GameTask/TaskContext.cs index ddd16d5a..4ce0b6cf 100644 --- a/BetterGenshinImpact/GameTask/TaskContext.cs +++ b/BetterGenshinImpact/GameTask/TaskContext.cs @@ -5,6 +5,8 @@ using BetterGenshinImpact.Genshin.Settings; using BetterGenshinImpact.Helpers; using BetterGenshinImpact.Service; using System; +using System.Collections.Generic; +using System.IO; using System.Threading; using BetterGenshinImpact.Core.Script.Group; @@ -74,5 +76,35 @@ namespace BetterGenshinImpact.GameTask /// 注意 IsInitialized = false 时,这个值就会被设置 /// public DateTime LinkedStartGenshinTime { get; set; } = DateTime.MinValue; + + public List GetGenshinGameProcessNameList() + { + if (IsInitialized) + { + return [SystemInfo.GameProcessName]; + } + else + { + List list = ["YuanShen", "GenshinImpact", "Genshin Impact Cloud Game", "Genshin Impact Cloud"]; + try + { + var installPath = Config.GenshinStartConfig.InstallPath; + if (!string.IsNullOrEmpty(installPath)) + { + var customName = Path.GetFileNameWithoutExtension(installPath); + if (!string.IsNullOrEmpty(customName) && !list.Contains(customName)) + { + list.Insert(0, customName); // 将用户自定义的进程名放在列表前面,优先匹配 + } + } + } + catch + { + /* ignore */ + } + + return list; + } + } } -} +} \ No newline at end of file diff --git a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs index 5de056bf..3777949f 100644 --- a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs @@ -383,7 +383,7 @@ public partial class HomePageViewModel : ViewModel // 弹出选择文件夹对话框 var dialog = new Ookii.Dialogs.Wpf.VistaOpenFileDialog { - Filter = "原神|YuanShen.exe|原神国际服|GenshinImpact.exe|所有文件|*.*" + Filter = "原神|YuanShen.exe;GenshinImpact.exe|可执行文件|*.exe|所有文件|*.*" }; if (dialog.ShowDialog() == true) {