URI方案启动

19

我被分配了一个任务,需要创建一个类似于callto:的协议,在单击带有该协议链接的情况下,会自动启动已安装的应用程序。

我遵循了微软指南中关于协议应该如何看起来的说明。

我的协议看起来像这样:

HKEY_CLASSES_ROOT
   slican
       URL Protocol = ""
       DefaultIcon (Default) = "C:\Users\Okabe\Desktop\slican\SlicanP.exe,1"
       shell
            open
                command (Default) = "C:\Users\Okabe\Desktop\slican\SlicanP.exe" "%1""

我原以为就这样了,并用以下方式进行测试:

 <a href="slican:test">test link</a>
 <a href="slican:0049325778421">test telephone link</a>

没有任何反应。Internet Explorer 问我是否要搜索可以打开此内容的程序,Chrome 没有任何响应,就像我点击了 javascript:void(0) 一样。

如何使其工作?

谢谢您的帮助!


4
这并不正确。如果您阅读URI规范,特别是第3.2节,存在//会将test转换为远程主机名。slican:test是调用本地计算机上的自定义应用程序并将test作为输入参数的正确语法。 - Remy Lebeau
@Remy,不知道那个意思。谢谢!即使不知道这些斜杠的含义,我仍然能记住最常用的本地调用协议之一——mailto。我应该再想一想... - TLama
3个回答

24
当我在Windows 7上尝试时,您展示的注册工作得非常好。在SlicanP.exe的位置注册的本地应用程序,在我从“开始|运行”菜单和Windows Explorer地址栏中调用slican:URL时正常运行,因此注册有效。
请注意,Internet Explorer在较低的完整性安全上下文中运行,因此可能没有运行本地程序的权限。当我尝试点击到slican:URL的HTML链接或在地址栏中键入slican:URL时,IE无法执行本地应用程序(即使在提示允许之后)。我必须以管理员身份运行IE,然后本地应用程序才能正常运行。
此外,您确实不应直接创建HKEY_CLASSES_ROOT\slican键。改为创建HKEY_CURRENT_USER\Software\Classes\slican(仅限当前用户)或HKEY_LOCAL_MACHINE\Software\Classes\slican(所有用户)。有关更多详细信息,请参阅MSDN: HKEY_CLASSES_ROOT Key

合并查看HKEY_CLASSES_ROOT

更新: 由于它在Windows 7中可用,微软可能已经改变了在Windows 8中注册URL方案的方式。例如,电话/商店应用程序使用URI激活:

URI激活(XAML)

URI激活(HTML)

文档中提到了两种注册自定义URI方案的方法:

Internet Explorer有两种机制来注册新的可插拔协议处理程序。第一种方法是注册URI方案名称及其关联应用程序,以便使用该方案导航到URI的所有尝试都会启动应用程序(例如,注册用于处理mailto:或news: URI的应用程序)。第二种方法使用异步可插拔协议API,它允许您通过将URI方案映射到一个类来定义新的协议。
你正在使用第一种方法。尝试改用第二种方法。
然而,我刚刚注意到“异步可插拔协议”在MSDN上列在“遗留API”部分,并且它有以下注释:
“第三方协议实现将无法在使用JavaScript的Windows Store应用程序中加载,也无法在新的Windows UI中的Internet Explorer中加载。”
因此,在Windows 8中可能会工作,也可能不会工作。
更新:我刚刚发现这个: 文件类型和URI的指南 在Windows 8中,应用程序与它们支持的文件类型之间的关系与Windows的先前版本不同。

步骤:使用 Windows 8 自定义协议激活

Windows 8 中的文件类型和协议关联模型已经变化。应用程序不再能够通过编程方式将自己设置为文件类型或协议的默认处理程序。现在,用户始终控制文件类型或协议的默认处理程序。

您的应用程序可以使用现有协议进行通信,例如mailto,或创建自定义协议。协议激活扩展使您能够定义自定义协议或注册以处理现有协议。

另请查看:

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

以及:

默认程序


那么,IE和Chrome无法启动我的SlicanP.exe的原因是什么? Chrome甚至不会弹出问题,询问我是否要运行外部应用程序,就像IE一样...?没有任何浏览器做出反应... - Sates
1
对我来说运行良好。你使用的是哪个版本的Windows?IE的版本是多少?Chrome呢? - Remy Lebeau
Windows 8,Chrome 35.0.1916.153 m - Sates
由于它在Windows 7中运行,微软可能已经改变了在Windows 8中注册URL方案的方式。例如,电话/商店应用程序使用URI激活。 - Remy Lebeau
非常感谢。现在我只需要努力将其与我的Delphi 7应用程序适配... - Sates
显示剩余5条评论

1
如果你前往C:\Users\\AppData\Local\Google\Chrome\User Data,
你可以编辑Local State文件。
搜索protocol_handler。
这里的语法是键值对。我通常复制两个mailto:并确保将你的协议设置为false。这意味着Chrome会将你的新协议视为URI_Handler事件。

2
这似乎已经不再有效了。Chrome版本59.0.3071.86(官方版本)(64位),本地状态文件中没有protocol_handler部分。 - KC Wong

0

如果您在配置自定义URI方案时遇到问题,可以将自己的配置与现有配置进行比较。例如,“HKEY_CLASSES_ROOT/mailto” - 最有可能您的系统中已经存在。


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