如何识别通过URI打开Windows MAUI应用的程序(如浏览器)
解决方案:在Windows MAUI .NET 9中唤起原浏览器打开指定URI
要实现从MAUI应用打开唤起它的同款浏览器(而非默认浏览器),需要针对Windows平台调用原生进程API,具体步骤如下:
1. 核心思路
通过获取当前MAUI应用的父进程(即唤起它的浏览器进程),直接调用该浏览器的可执行文件打开目标URI;若获取父进程失败或启动失败,则回退到默认的Launcher方式。
2. 代码实现
2.1 添加必要的NuGet包
安装System.Management包,用于获取父进程信息。
2.2 实现进程扩展方法
添加平台专属代码,用于获取当前进程的父进程:
#if WINDOWS using System.Diagnostics; using System.Management; public static class ProcessExtensions { public static Process? GetParentProcess(this Process process) { try { using var searcher = new ManagementObjectSearcher( $"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {process.Id}"); foreach (var obj in searcher.Get()) { var parentId = (uint)obj["ParentProcessId"]; if (parentId == 0) return null; return Process.GetProcessById((int)parentId); } } catch { // 捕获异常,返回null触发回退逻辑 } return null; } } #endif
2.3 实现打开URI的方法
编写平台适配的方法,优先使用原浏览器打开URI:
using Microsoft.Maui.ApplicationModel; using System.Diagnostics; public async Task OpenInCallingBrowserAsync(string targetUri) { #if WINDOWS var currentProcess = Process.GetCurrentProcess(); var parentProcess = currentProcess.GetParentProcess(); if (parentProcess != null && !string.IsNullOrEmpty(parentProcess.MainModule?.FileName)) { try { // 调用原浏览器进程打开目标URI Process.Start(new ProcessStartInfo { FileName = parentProcess.MainModule.FileName, Arguments = $"\"{targetUri}\"", UseShellExecute = false }); return; } catch { // 启动失败,执行回退逻辑 } } #endif // 回退到默认浏览器打开 await Launcher.Default.OpenAsync(new Uri(targetUri)); }
3. MSIX打包注意事项
如果应用采用MSIX打包,需要启用全信任权限才能使用Process.Start:
- 打开项目的
Package.appxmanifest文件; - 添加受限能力命名空间及权限:
<Package ... xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="rescap"> ... <Capabilities> <rescap:Capability Name="runFullTrust" /> </Capabilities> </Package>
4. 调用示例
在需要打开URI的场景中直接调用方法:
// 假设从唤起URI中解析出的目标网页地址为targetUrl await OpenInCallingBrowserAsync(targetUrl);
内容的提问来源于stack exchange,提问作者bobwki
相关产品推荐
相关产品推荐

