Windows 11中.NET MAUI应用获取默认浏览器设置失效问题
解决.NET MAUI中Windows默认浏览器检测失效问题
问题原因
直接读取HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice注册表项的方法在Windows 10 1703及以后版本会失效——微软对该路径下的Progid字段添加了哈希验证机制,切换默认浏览器时该字段不会实时更新,导致读取结果始终停留在旧值(比如你遇到的始终返回ChromeHTML)。
可行解决方案
方案一:调用Windows原生API AssocQueryString
通过系统API直接查询HTTP协议关联的默认可执行文件,绕过注册表哈希限制,结果准确可靠。
在.NET MAUI的Windows项目中添加以下工具类:
using System.Runtime.InteropServices; using System.Text; public static class DefaultBrowserDetector { [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern uint AssocQueryString( AssocF flags, AssocStr strType, string association, string extra, [Out] StringBuilder output, ref uint outputSize); [Flags] private enum AssocF { None = 0 } private enum AssocStr { Executable = 2 } public static string GetDefaultBrowserExecutablePath() { uint bufferSize = 0; // 先获取所需缓冲区大小 AssocQueryString(AssocF.None, AssocStr.Executable, "http", null, null, ref bufferSize); var buffer = new StringBuilder((int)bufferSize); uint result = AssocQueryString(AssocF.None, AssocStr.Executable, "http", null, buffer, ref bufferSize); return result == 0 ? buffer.ToString() : null; } }
在MAUI代码中通过条件编译调用(仅Windows平台生效):
#if WINDOWS string browserPath = DefaultBrowserDetector.GetDefaultBrowserExecutablePath(); string browserName = string.Empty; if (!string.IsNullOrEmpty(browserPath)) { if (browserPath.IndexOf("chrome.exe", StringComparison.OrdinalIgnoreCase) != -1) { browserName = "Google Chrome"; } else if (browserPath.IndexOf("msedge.exe", StringComparison.OrdinalIgnoreCase) != -1) { browserName = "Microsoft Edge"; } } // 后续使用browserName或browserPath完成业务逻辑 #endif
方案二:读取备用注册表路径
如果不想调用原生API,可以尝试读取HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.http\UserChoice路径下的Progid,部分场景下该路径的更新更及时。但注意该路径同样可能受哈希机制影响,可靠性略低于API方案。
说明
以上方案均针对.NET MAUI的Windows平台优化,AssocQueryString API是微软推荐的查询默认关联程序的方式,能适配Windows 10/11的各种版本,不会出现注册表读取失效的问题。
内容的提问来源于stack exchange,提问作者bobwki
相关产品推荐
相关产品推荐

