From 2d29a004e2ad1c5135f7b6d73fd463983181472b Mon Sep 17 00:00:00 2001 From: Dime Date: Fri, 19 Jun 2026 02:15:59 +0800 Subject: [PATCH 1/2] fix: Fix bug where parameters could not be passed correctly when launching the game --- BedrockLauncher.Core/BedrockCore.cs | 95 +++++++++++++++++++++++------ TestProject/Program.cs | 6 +- 2 files changed, 81 insertions(+), 20 deletions(-) diff --git a/BedrockLauncher.Core/BedrockCore.cs b/BedrockLauncher.Core/BedrockCore.cs index 69ca208..ca96be8 100644 --- a/BedrockLauncher.Core/BedrockCore.cs +++ b/BedrockLauncher.Core/BedrockCore.cs @@ -267,6 +267,7 @@ private static DateTime GetStartTimeSafe(Process proc) return DateTime.MinValue; } } + /// /// Launch the Minecraft game process based on the specified launch options /// @@ -280,24 +281,24 @@ public async Task LaunchGameAsync(LaunchOptions options) options.Progress?.Report(LaunchState.Launching); string targetExe = "Minecraft.Windows.exe"; string fullPath = Path.Combine(options.GameFolder, targetExe); - string processName = Path.GetFileNameWithoutExtension(targetExe); + string processName = Path.GetFileNameWithoutExtension(targetExe); - var beforeSnapshot = Process.GetProcessesByName(processName) .ToDictionary(p => p.Id, p => GetStartTimeSafe(p)); - DateTime launchTime = DateTime.Now; Process.Start(new ProcessStartInfo { - FileName = "explorer.exe", - Arguments = fullPath, - UseShellExecute = true + FileName = "cmd.exe", + ArgumentList = + { "/c", "start", fullPath, string.IsNullOrEmpty(options.LaunchArgs) ? "" : options.LaunchArgs }, + UseShellExecute = false, + CreateNoWindow = true }); Process minecraftProcess = null; - + for (int i = 0; i < 10; i++) { var currentProcesses = Process.GetProcessesByName(processName); @@ -310,7 +311,7 @@ public async Task LaunchGameAsync(LaunchOptions options) DateTime startTime = GetStartTimeSafe(proc); if (startTime == DateTime.MinValue) - continue; + continue; if (startTime >= launchTime.AddMilliseconds(-200)) { @@ -323,8 +324,9 @@ public async Task LaunchGameAsync(LaunchOptions options) break; Thread.Sleep(500); - + } + process = minecraftProcess; options.Progress?.Report(LaunchState.Launched); @@ -345,10 +347,12 @@ public async Task LaunchGameAsync(LaunchOptions options) MinecraftGameTypeVersion.Release => "Microsoft.MinecraftUWP", MinecraftGameTypeVersion.Preview => "Microsoft.MinecraftWindowsBeta" }; + if (!File.Exists(manifest)) { throw new IOException("File doesn't exist"); } + PackageManager packageManager = new PackageManager(); bool twice_launch = false; foreach (var package in packageManager.FindPackagesForUser(string.Empty)) @@ -361,6 +365,7 @@ public async Task LaunchGameAsync(LaunchOptions options) } } } + bool is_installed = UwpRegister.UwpRegister.IsPackageInstalled(packageName); var config = new DeploymentOptionsConfig(); options.Progress?.Report(LaunchState.Registering); @@ -370,6 +375,7 @@ public async Task LaunchGameAsync(LaunchOptions options) ? DeploymentOptions.DevelopmentMode | DeploymentOptions.ForceUpdateFromAnyVersion : DeploymentOptions.DevelopmentMode; config.ProgressCallback = options.RegisterProgress; + if (!twice_launch && is_installed || !is_installed) { var appxAsync = await UwpRegister.UwpRegister.RegisterAppxAsync(config); @@ -385,7 +391,7 @@ public async Task LaunchGameAsync(LaunchOptions options) var appDiagnosticInfos = AppDiagnosticInfo.RequestInfoForPackageAsync(packageFamily).AsTask().Result; if (appDiagnosticInfos.Count != 0) { - await appDiagnosticInfos[0].LaunchAsync(); + await appDiagnosticInfos[0].LaunchAsync(); } } else @@ -394,23 +400,78 @@ public async Task LaunchGameAsync(LaunchOptions options) { TargetApplicationPackageFamilyName = packageFamily }; - if (options?.LaunchArgs == string.Empty) - { - await Launcher.LaunchUriAsync(new Uri(options.LaunchArgs), options_st); - } - else + + // 构建启动 URI + string uriString = "minecraft://launch"; + + if (!string.IsNullOrEmpty(options?.LaunchArgs)) { - await Launcher.LaunchUriAsync(new Uri("minecraft://launch"), options_st); + string queryString = string.Empty; + string launchArgs = options.LaunchArgs; + + if (launchArgs.StartsWith("minecraft://", StringComparison.OrdinalIgnoreCase)) + { + int questionMarkIndex = launchArgs.IndexOf('?'); + if (questionMarkIndex >= 0 && questionMarkIndex < launchArgs.Length - 1) + { + queryString = launchArgs.Substring(questionMarkIndex + 1); + } + else + { + string path = launchArgs.Substring("minecraft://".Length).TrimStart('/'); + if (!string.IsNullOrEmpty(path)) + { + queryString = $"{path}=true"; + } + } + } + else + { + // 如果传入的不是 minecraft:// 格式,直接作为参数 + // 检查是否已经是 key=value 格式 + if (launchArgs.Contains('=') && !launchArgs.Contains(' ')) + { + queryString = launchArgs; + } + else if (launchArgs.Contains('=') && launchArgs.Contains(' ')) + { + var pairs = launchArgs.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) + .Where(arg => arg.Contains('=')) + .Select(arg => arg.Trim()) + .ToArray(); + if (pairs.Length > 0) + { + queryString = string.Join("&", pairs); + } + else + { + queryString = $"args={Uri.EscapeDataString(launchArgs)}"; + } + } + else + { + queryString = $"args={Uri.EscapeDataString(launchArgs)}"; + } + } + + if (!string.IsNullOrEmpty(queryString)) + { + uriString = $"minecraft://launch?{queryString}"; + } } - + + await Launcher.LaunchUriAsync(new Uri(uriString), options_st); } + Process[] processes = Process.GetProcessesByName("Minecraft.Windows"); Process[] process_oldVersion = Process.GetProcessesByName("Minecraft.Win10.DX11"); processes = processes.Concat(process_oldVersion).ToArray(); process = processes.OrderBy(p => p.StartTime).Last(); } + return process; } + /// /// Remove Uwp Minecraft Game /// diff --git a/TestProject/Program.cs b/TestProject/Program.cs index 592d848..50b31f2 100644 --- a/TestProject/Program.cs +++ b/TestProject/Program.cs @@ -12,10 +12,10 @@ static void Main(string[] args) bedrockCore.InitAsync().Wait(); var launchOptions = new LaunchOptions() { - GameFolder = Path.GetFullPath(@"E:\Bedrock\bedrock_versions\1.21.11401"), - MinecraftBuildType = MinecraftBuildTypeVersion.UWP, + GameFolder = "D:\\BedrockBoot\\bedrock_versions\\1.21.11401", GameType = MinecraftGameTypeVersion.Release, - LaunchArgs = null + MinecraftBuildType = MinecraftBuildTypeVersion.UWP, + LaunchArgs = "minecraft://creator/?Editor=true" }; var process = bedrockCore.LaunchGameAsync(launchOptions).Result; Console.WriteLine(process.Id); From 0e7396a0d7f3b6cb1e20db97bf1b072709d71f52 Mon Sep 17 00:00:00 2001 From: Dime Date: Fri, 19 Jun 2026 02:17:22 +0800 Subject: [PATCH 2/2] chore: update version --- BedrockLauncher.Core/BedrockLauncher.Core.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BedrockLauncher.Core/BedrockLauncher.Core.csproj b/BedrockLauncher.Core/BedrockLauncher.Core.csproj index 59a717a..b893b52 100644 --- a/BedrockLauncher.Core/BedrockLauncher.Core.csproj +++ b/BedrockLauncher.Core/BedrockLauncher.Core.csproj @@ -20,11 +20,11 @@ true - 2.0.4.3-dev + 2.0.4.4-dev - 2.0.4.3 + 2.0.4.4