以编程方式向mailto协议注册Windows程序

43

如何使mailto:链接与我的程序关联?

接下来,我该如何在程序中处理这个事件?

我从快速谷歌搜索中找到的大部分解决方案都是手动完成的。但如果用户单击“设置为默认电子邮件客户端”等按钮,则我需要自动完成此操作。

#编辑:由于答案与您使用的编程语言无关,请删除对Delphi的参考。


这是微软官方提供的编程方式来更改默认邮件客户端。虽然是使用Visual Basic,但我希望您可以从这个链接中清楚地了解概念:http://support.microsoft.com/kb/299853 - Michael Stum
从您的链接中:“这与用于从系统中的任何位置启动任意URL的默认Web浏览器或电子邮件客户端是分开的。”这也是我想知道的另一件事,但并不是这个问题的答案。 - Liron Yahdav
请注意,微软的 kb 文章链接已经失效,因为微软认为有必要将其删除,并且他们从未允许在 wayback 机器上进行存档。在有人提供信息之前,请参考这个优秀的讨论:https://superuser.com/questions/1045349/where-windows-10-stores-default-email-app-in-its-registry - Ted Mittelstaedt
2个回答

19

@Dillie-O:你的回答让我找到了正确的方向(我应该预料到只需要更改注册表),我已经解决了这个问题。但我会把这个回答标记为最佳答案,因为我将在此基础上添加一些额外的信息。

这个问题的解决方案不取决于使用什么编程语言,只要有一种方法可以修改Windows注册表设置即可。

最后,以下是答案:

  • 将一个程序与计算机上的所有用户关联到mailto协议,将HKEY_CLASSES_ROOT\mailto\shell\open\command默认值更改为:
    "您的程序可执行文件" "%1"
  • 要将邮件协议与当前用户关联的程序,请将HKEY_CURRENT_USER\Software\Classes\mailto\shell\open\command默认值更改为:
    "您的程序可执行文件" "%1"

%1将被替换为整个mailto URL。例如,给出以下链接:

<a href="mailto:user@example.com">Email me</a>

以下内容将会被执行:
"你程序的可执行文件" "mailto:user@example.com"

更新(通过shellscape的评论):
自Windows 8起,此方法不再按预期工作。Win8强制执行以下密钥:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associati‌​ons\URLAssociations\‌​MAILTO\UserChoice,而所选应用程序的ProgID已被散列化,无法被伪造。这是一个巨大的麻烦。


你是否检查过现在是否可以将此标记为“最佳答案”?我不知道所需的最低声望值。 - tzot
1
从Windows 8开始,该方法不再按预期工作。Win8强制执行以下密钥:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\URLAssociations\MAILTO\UserChoice,所选应用程序的ProgID被散列化并且无法伪造。这真是一件令人头疼的事情。 - shellscape

13

根据我所了解的,有几个注册表键可以设置默认邮件客户端。其中之一是:

系统键:[HKEY_CLASSES_ROOT\mailto\shell\open\command]

值名称:(Default)

数据类型:REG_SZ(字符串值)

值数据:邮件程序命令行

我不熟悉 Delphi 7,但我确信它们有一些注册表编辑库可用于修改此值。

一些地方列出的内容比这个更多,而其他地方只是这个键,因此您可能需要进行一些测试以找到适当的键。


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