如何在Windows 7上注册自定义程序以处理mailto协议

4

好的,也许这是我的系统问题,但我在让Windows 7将我的自定义exe作为mailto协议的默认处理程序方面遇到了很大的问题。

首先,我看到了这个链接: 以编程方式注册mailto协议的Windows程序

接下来,我看到了这些:

我已经添加了似乎适合的注册表项,但每次单击mailto链接时仍然会弹出Windows Live Mail。我已将所有用户和当前用户的注册表项设置为相同,但仍然无法解决问题。

当我进入“默认程序”应用并滚动到mailto协议时,我只看到Outlook和Windows Live Mail两个选项。我的自定义应用程序甚至没有出现。

我想这要么是Windows 7的特殊问题,要么就是我的计算机存在问题。

我的自定义应用程序是一个WinForms .Net应用程序,但我认为这并不重要。

如果您有任何想法,请告诉我。

4个回答

2

您在问题中提到的答案中描述的方法似乎是Windows 7和其他操作系统的正确方法。

我猜您使用的是64位版本的Windows 7,而您的程序是32位应用程序。因此,如果您的应用程序写入HKEY_LOCAL_MACHINE\SOFTWARE\Classes\mailto\shell\open\command键,它只会修改用于32位应用程序的键HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\mailto\shell\open\command。您可以在这里这里阅读有关注册表虚拟化的更多信息。

如果是您的情况,您可以直接调用本地的 Win32 API RegOpenKeyEx,并使用 KEY_WOW64_64KEY 标志,这将在 32 位操作系统上被忽略。

是的,看起来似乎是正确的...但是,在我的系统和应用程序上实际上并不能工作。这是一个.NET应用程序,因此在64位操作系统上是64位,在32位操作系统上是32位。在我的情况下,我正在运行Win7 x64。 - John
@John:使用.NET应用程序并不像你描述的那样容易。.NET代码将被放置在.EXE或.DLL文件中作为资源,但是EXE或DLL可以是64位或32位,而不能同时存在。您可以运行dumpbin.exe /headers Your.exe并验证在FILE HEADER VALUES中是否有machine (x64)machine (x86)。只需尝试比较dumpbin.exe /headers C:\Windows\system32\notepad.exe的输出与dumpbin.exe /headers C:\Windows\SysWOW64\notepad.exe的输出即可。 - Oleg
我非常清楚 .Net 的“位数”。如果您愿意,我知道检查 IntPtr.Size 将在作为 32 位应用程序运行时返回 4,在作为 64 位应用程序运行时返回 8。这部分在我的脑海中不是一个问题。 - John
我接受了这个答案,因为实际上,这只是我的机器出了一些奇怪的问题。新安装显示它在这里正常工作:https://dev59.com/BHVD5IYBdhLWcg3wXamd - John

1

虽然回答有点晚,但对我有效的方法是:在注册表编辑器中,这个键覆盖了其他答案中提到的注册表键:

HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\URLAssociations\MAILTO\Userchoice

请查看此页面: 默认 Mailto 注册表


0

谢谢您的回复,但我不想添加自定义URL处理程序。我想修改一个现有的常用处理程序。 - John

-1

这似乎是一个非常高级的问题,但实际上是一个相当普遍的问题。作为一个技术宅,我被64位和x86之间的讨论以及.net的准通用二进制方面所吸引。但是,作为技术支持故障排除员,我不能不想到核心问题需要明确并系统地解决...

所以,无论您使用哪个邮件客户端(正如您自己所说),也无论您使用的是哪种CPU,您真正的问题是无法将您的邮件客户端设置为mailto的默认协议处理程序。或者简单地说,您无法将您喜欢的程序设置为默认程序。

我倾向于认为64/86方面的问题并不相关。它们很有趣,可能会产生一些影响,但如果程序运行良好(在该架构中没有代码问题等),并且它可以很好地发送和接收电子邮件(所有SMTP和IMAP都可以),那么我怀疑操作系统是否会阻止客户端成为领导者。

如果有什么问题,我会说客户自尊心不足,害怕成为mailto协议处理程序。大多数客户都无法抵制询问是否应该成为主要程序,如果您回答是,则将消息传递给其他应用程序和注册表。他们确保每个人都知道他们是新的邮箱之王。

因此,我首先会尝试以下基本故障排除方法:安装另一个邮件客户端,看看是否存在相同的问题。如果是,则您的操作系统是个恶霸,您需要探索这样的路线。

但是,如果此其他客户端可以进入默认程序俱乐部并成为mailto处理程序,则问题出在您的应用程序上。它是一个软弱无力的应用程序,不知道如何正确地表达自己。

但是,就像许多处于劣势地位的人等待着酷孩子收留他们一样(我的意思是Thunderbird。不要费心使用任何其他客户端),您的应用程序可以站在第三方客户端的肩膀上。

我们必须假设Thunderbird至少做了一件,也可能是两件,你的应用程序没有做到的事情。首先,它将自己的名称与注册表中的协议相关联。请到周围去看看,看看能否找到他的名字以及如何与mailto协议相关联。很有可能你可以把他的名字换成你的名字,或者至少尝试将协议钉在你的名字上。
T-Bird可能做的第二件事是将自己放入“默认程序”列表(这是7的一个功能,我并不是真的喜欢它,因为它背后有一个很酷的概念 - 即,让我们将应用程序一起分组,而不是每次等待并查看其中一个是否能够完成类似的工作。但Windows破坏了这种好时光(大惊喜),像一位过于保护孩子的父母一样出现在孩子的聚会上,说:“我认为这两个应该在这个组里,你不觉得吗?”
我希望通过从Thunderbird借用获取mailto的访问权限,您将被欢迎加入默认程序俱乐部,但如果您没有,并且仍然是mailto处理程序,则需要放弃它,至少在攀比这个问题之前沾沾自喜一两个星期。

现在,如果Thunderbird无法获取mailto控件,我非常倾向于认为Windows 7实际上已经建立了某种奇怪的种姓制度,即应用程序及其安装程序(例如用户)必须通过找出大秘密来证明自己有资格加入该组。

哦,如果一切都失败了,请尝试在没有网络的安全模式下重新启动,在那个环境中安装您的客户端,并启动它。看看是否可以在其他人处于暂停状态时将其设置为默认值。通过编写带有mailto的基本HTML页面进行测试运行(显然没有网络),并查看单击它是否会打开您的客户端。

然后,当您正常启动时,请祈祷好运。

如果以上任何内容对您有所帮助,请告诉我。


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