在 Windows 8 中以编程方式设置 mailto 协议处理程序

3
在Windows 8之前,添加mailto:协议处理程序的方法很简单(如此处所述:以编程方式注册邮件协议的Windows程序)。
从Windows 8开始,旧方法不再适用。似乎Win8强制执行以下键:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\URLAssociations\‌​MAILTO\UserChoice
选择应用程序的ProgID也被哈希化,不能伪造,至少我看不出来。
是否有工作方法或可以指向一个实现此操作的实用程序类/代码?
对于代码,任何语言都可以。
编辑
在其他讨论中,我被要求指定用例,因此我认为在这个问题的上下文中会很有帮助。请考虑此屏幕截图https://github.com/shellscape/Gmail-Notifier-Plus/raw/master/Promotional/prefs-account.png和允许用户指定mailto处理的复选框。在这种用例中,没有人强迫用户,用户掌握并做出决定。虽然Windows 8商店应用程序(metro/modern)具有可用的应用程序清单条目,可以自动化上述缺失的过程,但似乎没有针对桌面应用程序的现成解决方案。

你尝试过在传统方式设置注册表键后删除“UserChoice”注册表键吗? - selbie
是的。这只会在点击mailto链接后引起“您想如何打开此链接”飞入。 - shellscape
4个回答

5
您可以将您的应用程序设置为通过自定义协议(例如mailto:)激活。当用户安装您的应用时,如果没有其他应用程序支持该协议,则不会提示用户,并且自动分配给该协议。
但是,如果用户已经有一个处理该协议的应用程序,则会提示他们选择支持该协议的应用程序列表,并选择默认选项。您无法强制用户进行特定选择。
此外,如果用户单击协议(例如myprotocol:),并且他们没有安装处理该协议的应用程序,则会发送到商店(应用程序),该商店会自动搜索所有支持该协议的应用程序。然后用户安装任何他们想要的。您无法强制用户进行特定选择(如果有的话)。
我写了一篇关于协议激活的文章。这可能对您有趣:http://blog.jerrynixon.com/2012/10/walkthrough-using-windows-8-custom.html

这是一篇不错的文章,我相信它会对偶然看到这篇帖子的Windows 8 现代/元素应用程序开发人员有所帮助。但是,它并没有涉及桌面应用程序。我已经更新了原始帖子以反映桌面应用程序的使用场景。 - shellscape
抱歉,我看到 [tag:Windows-8] 就以为是 WinRT 了。对不起。 - Jerry Nixon

1
所以,我今天将桌面版Firefox设置为Windows 8中的默认mailto处理程序,方法是在HKCU\Software\Clients\StartMenuInternet\FIREFOX.EXE\Capabilities\URLAssociations下添加字符串值“mailto”,并将“mailto”的值设置为ProgID或“FirefoxURL”。然后,我删除了HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\URLAssociations\MAILTO\UserChoice下的键,以允许我再次选择默认客户端,这次Firefox可供选择。
这个问题的本质似乎是不能再接管任何协议的默认客户端(Windows 8之后)。用户必须选择。但是,如果您想打破操作系统约定,可以挂钩调用创建选择默认对话框的过程,这需要研究、努力和仅是临时的补救措施,并需要“破坏”操作系统;或者您可以向对话框发送双击以代表用户进行选择,假设您的程序具有提升的权限,以便它可以向管理员窗口发送点击。那可能是最简单的方法,用户永远不会知道发生了什么,只有一个快速的闪烁。不过,实际上,在注册自己作为协议处理程序之后,我认为任何程序都不应该超出删除默认协议处理程序注册表条目的范围,从而强制用户重新选择。

1
这是如何在Windows 8、8.1、2012和2012R2中手动简单设置mailto协议的方法。
添加一个新的注册表分支:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\mailto\UserChoice 然后在您的Web浏览器(例如IE)中单击任何mailto链接,最终会出现一个程序列表供您选择,而此前该选项是不可用的。
此外,MAILTO现在出现在控制面板\所有控制面板项\默认程序中。那里没有其他添加/删除协议的选项。

0

引用该文章:“我们建议您在控制面板中链接到“设置默认程序”。”如果该页面详细介绍了如何“链接到”该控制面板小程序,那么这将是桌面应用程序的有用参考。即便如此,在之前的每个Windows版本中都必须存在解决方法。对于所提出的问题,这并不算作答案,但是是有用的信息。 - shellscape
1
该参考文档中缺少的附加信息是:如何注册您的桌面应用程序,以便被引用的控制面板对话框能够识别您的桌面应用程序。 - shellscape
1
有关如何显示UI以允许用户设置默认值的信息,请参见此链接:http://msdn.microsoft.com/en-us/library/windows/desktop/cc144160(v=vs.85).aspx#first_run_and_defaults - Pete
谢谢Pete。更进一步,这是一个C#封装器,围绕该API进行 http://davesbox.com/archive/2008/12/03/programmatically-opening-the-default-programs-window.aspx - shellscape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接