[转]Windows 注册自定义的协议

[转自] http://blog.sina.com.cn/s/blog_86e4a51c01010nik.html

1、注册应用程序来处理自定义协议

         你必须添加一个新的key以及相关的value到HKEY_CLASSES_ROOT中,来使应用程序可以处理特殊的URL协议。

         新注册的key必须与协议scheme相匹配才可以被添加。例如,增加一个“alert:”协议,被增加到HKEY_CLASSES_ROOT的key必须是alert。在这个新的key之下,默认的字符串value将显示新协议的名字,并且URL协议字符串value将包含协议特有的信息或者空字符串。Keys将同样被添加到DefaultIcon和shell中。

         默认的DefaultIcon key的字符串value必须是新URL协议图标文件名的路径。

         在shell key之下,一个key使用一个动词(就像open)将被添加。一个command(命令) key和一个DDEEXEC(动态数据交换执行) key都是使用动词来添加的。这command和DDEEXEC keys之后的values都是用来调用(或者启动)处理新协议的应用程序。

2、启动处理程序

         当一个用户点击一个注册了你的自定义URL协议的链接后,Windows Internet Explorer(IE)启动注册的URL协议的处理器。如果指定shellopen命令在注册表中包含一个%1参数的话,Internet Explorer传递这个URI给注册协议的处理器。这最后的统一资源标识符(URI)被编码(%1);即16进制换码符被转换为等价的UTF-16字符。例如,用%20字符串取代空格。

         安全警示:应用程序处理URL协议必须全力面对恶意数据。因为处理程序接收来自不信任源的数据,URL和其它参数值传递给应用程序可能包含的恶意数据企图使用处理程序。因此,处理程序可以首先启动基于外部数据的空闲行为确认这些行为以及它们的用户。

3、示例

         接下来的例子演示如何注册alert.exe应用程序,来处理alert协议。

         引用内容

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTalert]

@="URL:Alert Protocol"

"URL Protocol"="C:Program FilesAlertalert.exe"

[HKEY_CLASSES_ROOTalertDefaultIcon]

@="C:Program FilesAlertalert.exe,1"

[HKEY_CLASSES_ROOTalertshell]

[HKEY_CLASSES_ROOTalertshellopen]

[HKEY_CLASSES_ROOTalertshellopencommand]

@="C:Program FilesAlertalert.exe" "%1"

         增加这些设置信息到注册表,尝试导航到像“alert:Hello%20World”这样的URLs中,将会尝试启动alert.exe程序并且在命令行中传递“Hello World”。

4、协议处理实例

         下面的代码包含了一个简单的C#控制台应用程序演示了一种实现alert协议处理程序的方式:复制内容到剪贴板 程序代码

using System;

using System.Collections.Generic;

using System.Text;

namespace Alert1

{

  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("Alert.exe invoked with the following parameters. ");

      Console.WriteLine("Raw command-line: " + Environment.CommandLine);

      Console.WriteLine(" Arguments: ");

      foreach (string s in args)

      {

        Console.WriteLine(" " + ProcessInput(s));

      }

      Console.WriteLine(" Press any key to continue...");

      Console.ReadKey();

    }

  }

}

原文地址:https://www.cnblogs.com/z5337/p/4713474.html