You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:28:11