93

如何在 chrome 中设置自定义协议处理程序?就像是:

我的协议://测试文件

我需要它来向http://example.com?query=testfile发送请求,然后将 httpresponse 发送到我的扩展程序。

4

7 回答 7

83

以下方法将应用程序注册到 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 可以更改设置):

在这个路径下编辑“ Local State ”这个文件:

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

或只需访问:

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

然后,搜索这个字符串:protocol_handler

您将从那里看到自定义协议。

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

参考:

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

于 2016-06-02T20:46:13.170 回答
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

于 2011-08-18T00:54:38.623 回答
31

这个问题现在已经很老了,但是最近对 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并且可以在那里创建一个网页,将人们指向应用商店中的应用。

于 2014-03-25T16:40:58.723 回答
11

我就是这样做的。您的应用程序需要在安装时安装一些 reg 密钥,然后在任何浏览器中您只需链接到 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\"" 
于 2014-02-21T17:12:20.610 回答
1

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

问题:我希望 Linux Mint 19.2 Cinnamon 在单击mailtoChromium 中的链接时打开 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并适用于我的情况。

于 2019-12-18T10:25:11.760 回答
0

我找到了 Jun Hsieh 和 MuffinMan 的解决方案,通常在单击 Chrome 中页面上的链接或粘贴到 URL 栏中时有效,但在命令行上传递字符串的特定情况下似乎不起作用.

例如,以下两个命令都会打开一个空白的 Chrome 窗口,然后什么都不做。

"c:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "foo://C:/test.txt"
"c:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --new-window "foo://C:/test.txt"

作为比较,使用这些命令中的任何一个向 Chrome 提供 http 或 https URL 都会导致网页打开。

这变得很明显,因为我们的一位客户报告说,当 Chrome 是默认浏览器时,从显示在 Adob​​e Reader 中的 PDF 中单击我们产品的链接无法调用我们的产品。(默认使用 MSIE 和 Firefox 可以正常工作,但默认使用 Chrome 或 Edge 时则不行。)

我猜测,Adobe 产品不是只是告诉 Windows 调用 URL 并让 Windows 解决问题,而是找到默认浏览器,在这种情况下是 Chrome,然后在命令行上传递 URL。

如果有人知道 Chrome 安全性或其他可能与此处相关的设置,我会很感兴趣,以便 Chrome 将完全处理协议处理程序,即使它是通过命令行提供的。我一直在寻找,但到目前为止还没有找到任何东西。

我一直在针对 Chrome 88.0.4324.182 进行测试。

于 2021-02-17T04:17:04.153 回答
-1

打开

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

打开Preferences然后搜索excluded_schemes你会在'protocol_handler'中找到它删除这个排除的方案以重置chrome以使用默认应用程序打开url

于 2019-01-25T08:05:37.443 回答