You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Windows 10中正确注册自定义协议,让应用处理myscheme://类请求?

在Windows中正确注册自定义URI协议(分版本方案)

完全理解你的困扰——微软关于URI协议注册的文档确实零散又混乱,旧方案被废弃后,新方案的说明又不够直白,尤其是针对传统桌面应用的部分。下面我会分版本给出当前有效的方案,避开那些已废弃的API:

Windows 7及更早(兼容方案,已废弃)

你提到的HKEY_CLASSES_ROOT注册表方式确实是这一时期的标准做法,但正如微软文档所说,这种全局注册方式已经被废弃,不推荐在Windows 8及以上系统使用。不过如果你的应用需要兼容非常老旧的系统,这个方案依然可以生效,步骤就是你列出的那些:

HKEY_CLASSES_ROOT
  myscheme
    (Default) = "URL:Myscheme Protocol"
    URL Protocol = ""
    DefaultIcon
      (Default) = "myscheme.exe,1"
    shell
      open
        command
          (Default) = "C:\Program Files\Myscheme\myscheme.exe" "%1"

Windows 8/10/11(现代有效方案)

从Windows 8开始,系统收紧了默认应用的控制权,不再允许应用自行设置为URI协议的默认处理程序,必须由用户主动选择。针对传统桌面应用和MSIX打包应用,有两种不同的正确实现方式:

1. 传统桌面应用(非MSIX打包)

步骤1:用户级注册表注册(无需管理员权限)

现在推荐使用HKEY_CURRENT_USER\Software\Classes而非全局的HKEY_CLASSES_ROOT来注册,这样不需要管理员权限,也不会影响其他用户。创建以下注册表项:

HKEY_CURRENT_USER\Software\Classes\myscheme
    (Default) = "URL:Myscheme Protocol"  ; 协议标识
    URL Protocol = ""  ; 必须存在的空值,标记这是一个URI协议
    DefaultIcon
      (Default) = "C:\Program Files\Myscheme\myscheme.exe,1"  ; 图标路径和索引
    shell
      open
        command
          (Default) = "\"C:\Program Files\Myscheme\myscheme.exe\" \"%1\""  ; 注意转义引号

步骤2:触发用户选择默认应用

注册完成后,当用户第一次点击myscheme://foo这样的链接时,Windows会弹出提示窗口,让用户选择默认的处理应用,你的应用会出现在列表中。用户选择后,系统会记住这个关联。

如果想在应用启动时主动引导用户设置默认,可以调用Windows的LaunchUriAsync API(Win32应用可通过C++/WinRT或.NET的Windows API包装调用),或者直接引导用户到系统设置的「默认应用」页面。

2. MSIX打包应用(推荐)

如果你的应用采用MSIX打包(现代Windows应用推荐的分发方式),可以直接在Package.appxmanifest中声明URI协议,无需手动修改注册表。添加以下XML片段到你的清单中:

<Applications>
  <Application Id="MySchemeApp" Executable="myscheme.exe" EntryPoint="Windows.FullTrustApplication">
    <Extensions>
      <uap:Extension Category="windows.protocol">
        <uap:Protocol Name="myscheme">
          <uap:DisplayName>Myscheme 协议处理程序</uap:DisplayName>
          <!-- 可选:添加图标 -->
          <uap:Logo>Assets\ProtocolLogo.png</uap:Logo>
        </uap:Protocol>
      </uap:Extension>
    </Extensions>
  </Application>
</Applications>

打包安装后,系统会自动识别这个协议,用户可以在「设置-应用-默认应用-选择按协议设置的默认值」中找到并设置你的应用为默认处理程序,或者在第一次点击链接时选择。

版本差异总结

Windows版本推荐方案是否需要用户手动选择默认
Windows 7及更早HKEY_CLASSES_ROOT注册表注册否(自动关联)
Windows 8/10/11(桌面应用)HKEY_CURRENT_USER注册表注册是(首次点击或手动设置)
Windows 8/10/11(MSIX应用)清单文件声明协议是(首次点击或手动设置)

最后再强调一下:微软确实没有把桌面应用的URI协议注册说明整理得很清楚,很多旧文档还在网上流传,导致大家容易踩坑。上面的方案都是当前Windows官方认可的有效方式,避开了已废弃的API。

内容的提问来源于stack exchange,提问作者Alex Aparin

火山引擎 最新活动