From d632002e4b2083ad09e080b8ea4fb9257963d0bd Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Mon, 11 Mar 2024 09:33:21 +0800 Subject: [PATCH] Sync Scighost/Starward#692 --- .../LaunchExecutionEnsureGameNotRunningHandler.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameNotRunningHandler.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameNotRunningHandler.cs index fc6f132b..1cbb2c83 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameNotRunningHandler.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionEnsureGameNotRunningHandler.cs @@ -1,18 +1,27 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using System.Diagnostics; + namespace Snap.Hutao.Service.Game.Launching.Handler; internal sealed class LaunchExecutionEnsureGameNotRunningHandler : ILaunchExecutionDelegateHandler { - public static bool IsGameRunning([NotNullWhen(true)] out System.Diagnostics.Process? runningProcess) + public static bool IsGameRunning([NotNullWhen(true)] out Process? runningProcess) { + int currentSessionId = Process.GetCurrentProcess().SessionId; + // GetProcesses once and manually loop is O(n) - foreach (ref readonly System.Diagnostics.Process process in System.Diagnostics.Process.GetProcesses().AsSpan()) + foreach (ref readonly Process process in Process.GetProcesses().AsSpan()) { if (string.Equals(process.ProcessName, GameConstants.YuanShenProcessName, StringComparison.OrdinalIgnoreCase) || string.Equals(process.ProcessName, GameConstants.GenshinImpactProcessName, StringComparison.OrdinalIgnoreCase)) { + if (process.SessionId != currentSessionId) + { + continue; + } + runningProcess = process; return true; } @@ -24,7 +33,7 @@ internal sealed class LaunchExecutionEnsureGameNotRunningHandler : ILaunchExecut public async ValueTask OnExecutionAsync(LaunchExecutionContext context, LaunchExecutionDelegate next) { - if (IsGameRunning(out System.Diagnostics.Process? process)) + if (IsGameRunning(out Process? process)) { context.Logger.LogInformation("Game process detected, id: {Id}", process.Id);