Chrome中的自定义协议处理程序


Answers:


77

以下方法将应用程序注册到URI方案。因此,您可以在HTML代码中使用mycustproto:来触发本地应用程序。它适用于Google Chrome版本51.0.2704.79 m(64位)。

我主要使用这种方法以静默方式打印文档,而不会弹出打印对话框。结果非常好,并且是将外部应用程序与浏览器集成的无缝解决方案。

HTML代码(简单):

<a href="mycustproto:Hello World">Click Me</a>

HTML代码(替代):

<input id="DealerName" />
<button id="PrintBtn"></button>

$('#PrintBtn').on('click', function(event){
  event.preventDefault();
  window.location.href = 'mycustproto:dealer ' + $('#DealerName').val();
});

URI方案将如下所示:

您可以在注册表中手动创建URI方案,或运行“ mycustproto.reg”文件(请参见下文)。

HKEY_CURRENT_USER\Software\Classes
   mycustproto
      (Default) = "URL:MyCustProto Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "myprogram.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\MyProgram\myprogram.exe" "%1"

mycustproto.reg示例:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\mycustproto]
"URL Protocol"="\"\""
@="\"URL:MyCustProto Protocol\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\DefaultIcon]
@="\"mycustproto.exe,1\""

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open]

[HKEY_CURRENT_USER\Software\Classes\mycustproto\shell\open\command]
@="\"C:\\Program Files\\MyProgram\\myprogram.exe\" \"%1\""

C#控制台应用程序-myprogram.exe:

using System;
using System.Collections.Generic;
using System.Text;

namespace myprogram
{
  class Program
  {
    static string ProcessInput(string s)
    {
       // TODO Verify and validate the input 
       // string as appropriate for your application.
       return s;
    }

    static void Main(string[] args)
    {
      Console.WriteLine("Raw command-line: \n\t" + Environment.CommandLine);
      Console.WriteLine("\n\nArguments:\n");

      foreach (string s in args)
      {
        Console.WriteLine("\t" + ProcessInput(s));
      }

      Console.WriteLine("\nPress any key to continue...");
      Console.ReadKey();
    }
  }
}

尝试首先运行该程序,以确保将程序放置在正确的路径中:

cmd> "C:\Program Files\MyProgram\myprogram.exe" "mycustproto:Hello World"

单击HTML页面上的链接:

您将第一次看到警告窗口弹出。

在此处输入图片说明

要在Chrome中重置外部协议处理程序设置,请执行以下操作:

如果您曾经在Chrome中接受过自定义协议,并且想重置设置,请执行以下操作(当前,Chrome中没有UI可以更改设置):

在此路径下编辑“本地状态”此文件:

C:\Users\Username\AppData\Local\Google\Chrome\User Data\

或只需转到:

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\

然后,搜索以下字符串:protocol_handler

您将在此处看到自定义协议。

注意:在编辑文件之前,请关闭您的Google Chrome浏览器。否则,您所做的更改将被Chrome覆盖。

参考:

https://msdn.microsoft.com/zh-CN/library/aa767914(v=vs.85).aspx


这看起来很有希望,我可以使用这种方法从平板电脑进行打印。如果是这样的话,在这种情况下如何处理注册表等问题
Venkat

1
@Venkat我认为最好先指定平板电脑名称和操作系统(例如:Surface,iPad等),然后再看看其他人是否这样做。我发布的解决方案是针对Windows的。我已经看到了OS X和Linux的类似设置。但是,我没有方便使用这些设备/环境进行实验。您可以先在Windows上试用它,以了解其工作原理。我希望这将有所帮助。
Jun Xie

3
作为记录,我在文件中创建了protocol_handler配置选项Preferences,位于%localappdata%\Google\Chrome\User Data\Default
Babblo

无法在Chrome中的单个JavaScript调用中一个接一个地调用多个协议。

如果在注册表中找不到我的密钥怎么办?我想从浏览器中基于密钥调用应用程序吗?在这里,如何通知用户在注册表中找不到密钥?
Akhil Nair

55

Chrome 13现在支持该navigator.registerProtocolHandlerAPI。例如,

navigator.registerProtocolHandler(
    'web+custom', 'http://example.com/rph?q=%s', 'My App');

请注意,您的协议名称必须以开头web+,除了一些常见的例外(例如mailto,等等)。有关更多详细信息,请参阅:http : //updates.html5rocks.com/2011/06/Registering-a-custom-protocol-handler


6
协议必须以web +开头以避免“ SECURITY_ERR:DOM异常18”这一事实的+1
Catch22 2012年

3
如何torrent:steam:再环节的工作?Chrome打包应用程序也有此限制吗?
史蒂文·罗斯

1
@StevenRoose据我所知,Chrome将这些内容传递给了操作系统。即使使用chrome.webNavigationAPI,tel:也永远不会报告链接。
PixnBits 2015年

这似乎在chrome应用程序中无法正常运行,并且似乎无法在应用程序内重定向协议。更好的答案是下面的戈登·威廉姆斯答案。
卡雷尔·比列克(KarelBílek),2015年


30

这个问题现在已经很老了,但是Chrome最近更新了(至少在打包应用程序方面)...

http://developer.chrome.com/apps/manifest/url_handlers

https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/url-handler

它允许您注册URL的处理程序(只要您拥有它)。遗憾的是,没有,myprotocol://但是至少您可以做,http://myprotocol.mysite.com并且可以在那里创建一个网页,将人们指向应用商店中的应用。


非常感谢这个答案!与最高投票答案不同,它实际上可以回答问题!
卡雷尔·比列克(KarelBílek),2015年

10

这就是我的方法。您的应用程序需要在安装时安装一些注册表项,然后在任何浏览器中,您都可以链接到foo:\ anythingHere.txt,它将打开您的应用程序并将其传递给该值。

这不是我的代码,只是我在搜索同一问题时在网上找到的内容。只需将下面文本中的所有“ foo”更改为所需的协议名称,并更改exe的路径即可。

(将其保存为文本文件,另存为桌面上的foo.reg,然后双击以安装密钥)-----在此行下方进入.reg文件(不包括此行)- ---

REGEDIT4

[HKEY_CLASSES_ROOT\foo]
@="URL:foo Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\foo\shell]

[HKEY_CLASSES_ROOT\foo\shell\open]

[HKEY_CLASSES_ROOT\foo\shell\open\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\"" 

5
这在chrome中不起作用,这是具体问题。
Kjetil Watnedal 2014年

1
@KjetilWatnedal:在Chrome(至少在v40 +中)以及此解决方案中都可以正常工作。与最初的问题有关,OP希望浏览器自动将某些内容提交到站点,显然没有本地处理程序应用程序,这实际上是不可能的。
Marcel N.

7
我想让所有人都知道他的解决方案确实可以在Chrome中运行(今天已在49.0.2623.87中测试)。但是,我确实发现,如果直接在浏览器中输入此协议(foo:// C:/test.txt),则可能必须使用ctrl + enter,因为浏览器无法立即识别该协议,并且搜索协议会拦截操作系统可以执行的操作。但是,将其放在链接中可以正常工作。
蒂米

@timmy-非常感谢!我一直在努力尝试让协议处理程序在chrome中工作-原来我需要做的就是使用Ctrl + Enter!再次感谢!
车道

@timmy非常感谢您,我已经以为我的用户必须使用Internet Explorer
Pipe

2

不确定这是否是我的答案的正确位置,但是由于我发现很少有用的线程,而这是其中之一,因此我将解决方案发布在这里。

问题:单击mailtoChromium中的链接时,我希望Linux Mint 19.2 Cinnamon打开Evolution 。Gmail已在chrome:// settings / handlers中注册为默认处理程序,但我无法选择其他任何处理程序。

解决方案:在控制台中使用xdg-settings

xdg-settings set default-url-scheme-handler mailto org.gnome.Evolution.desktop

在这里找到解决方案https://alt.os.linux.ubuntu.narkive.com/U3Gy7inF/kubuntu-mailto-links-in-chrome-doesn-t-open-evolution,并且适合我的情况。


0

打开

C:\Users\<Username>\AppData\Local\Google\Chrome\User Data\Default

打开Preferences然后搜索,excluded_schemes您将在'protocol_handler'中找到它。删除此排除的方案,以重置chrome以使用默认应用程序打开url

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.