现在的位置: 首页 > 综合 > 正文

自定义地址栏协议

2014年02月22日 ⁄ 综合 ⁄ 共 10148字 ⁄ 字号 评论关闭

效果演示:打开IE 在地址栏内输入“mailto:”然后回车,系统将打开 OUTLook 软件。
本文就是要达到上面描述的效果。

一、步骤概述
1.将相关信息写入注册表,注册程序关联
2.获取地址栏的内容

二、开始编码
1.将相关信息写入注册表,注册程序关联
1.1.以下是待写入的注册表项和值

                    注:MyNode 为注册表自定义节点,@ 为默认键
                    1.新建项
                    [HKEY_CLASSES_ROOT/MyNode]
                    1.1 设置默认键的值
                    @="TencentProtocol"
                    1.2 创建新键并制定值
                    "URL Protocol"="C://app.exe"
                   
                    2.新建项
                    [HKEY_CLASSES_ROOT/MyNode/DefaultIcon]
                    2.1 设置默认键的值
                    @="C://app.exe,1"
                   
                    3.新建项
                    [HKEY_CLASSES_ROOT/MyNode/shell]
               
                    4.新建项
                    [HKEY_CLASSES_ROOT/MyNode/shell/open]
               
                    5.新建项
                    [HKEY_CLASSES_ROOT/MyNode/shell/open/command]
                    5.1 设置默认键的值
                    @="/"C://app.exe/" /"%1/""   
1.2以下是具体代码(C#)

/*-----------------------------------主程序入口点(Main函数)---------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args) //接收地址栏内容的命令行参数
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(args));
            //Application.Run(new Form2());
        }
    }
}

/*------------------------------------业务处理页面--------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1(string[] args) //接收地址栏内容的命令行参数
        {
            InitializeComponent();

            if (args != null)
            {
                foreach (string s in args)
                {
                    MessageBox.Show(s);
                }
            }
            else
            {
                MessageBox.Show("命令行参数为null");
            }
        }

        #region 方法
        private bool ClearProtocol(string subKeyName)
        {
            try
            {
                RegistryKey key = Registry.ClassesRoot;
                key.DeleteSubKeyTree(subKeyName);

                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }
        #endregion

        #region 递归创建注册表项和值
        /// <summary>
        /// 构建注册表项
        /// </summary>
        /// <param name="key">待构建的注册表项对象</param>
        /// <returns></returns>
        public bool GeneratorReg(List<RegKey> keys)
        {
            if (keys == null || keys.Count==0)
                return false;

            foreach(RegKey key in keys)
                this.RekursionGeneratorReg(key, key.SubKeyName, key.rootKey);

            return true;
        }
        /// <summary>
        /// 构建注册表项
        /// </summary>
        /// <param name="key">待构建的注册表项对象</param>
        /// <returns></returns>
        ///  <remarks>创建人员(日期):★ben★(100916 15:10)</remarks>
        public bool GeneratorReg(RegKey key)
        {
            if (string.IsNullOrEmpty(key.FullName))
                return false;

            this.RekursionGeneratorReg(key, key.SubKeyName, key.rootKey);

            return true;
        }
        /// <summary>
        /// 递归创建注册表项
        /// </summary>
        /// <param name="key">待构建的注册表项对象</param>
        /// <param name="subKeyName">注册表子路径(不包含顶级节点名,且不能以斜杠开头)</param>
        /// <param name="regKey">注册表键</param>
        ///  <remarks>创建人员(日期):★ben★(100916 15:09)</remarks>
        private void RekursionGeneratorReg(RegKey key, string subKeyName, RegistryKey regKey)
        {
            if (string.IsNullOrEmpty(subKeyName))
            {
                if (key.RegValus != null)
                {
                    foreach (RegValue rv in key.RegValus)
                    {
                        regKey.SetValue(rv.KeyName.Equals("@") ? "" : rv.KeyName, rv.KeyValue, rv.KeyValueKind);
                    }
                }
                return;
            }

            string currentKeyName = string.Empty;
            if (subKeyName.IndexOf(@"/") > -1)
            {
                currentKeyName = subKeyName.Substring(0, subKeyName.IndexOf(@"/"));
                subKeyName = subKeyName.Substring(subKeyName.IndexOf(@"/") + 1);
            }
            else
            {
                currentKeyName = subKeyName;
                subKeyName = string.Empty;
            }

            //1.不包含子节点
            if (regKey.OpenSubKey(currentKeyName) == null)
            {
                regKey.CreateSubKey(currentKeyName);
                regKey = regKey.OpenSubKey(currentKeyName, true);
                RekursionGeneratorReg(key,subKeyName,regKey);
            }
            else//2.包含子节点
            {
                regKey = regKey.OpenSubKey(currentKeyName, true);
                RekursionGeneratorReg(key, subKeyName, regKey);
            }

        }

        #endregion

        #region 事件

        private void btnReg_Click(object sender, EventArgs e)
        {
            List<RegKey> keys = new List<RegKey>();
            string appPath = Application.ExecutablePath;
            //1.新建项
            //[HKEY_CLASSES_ROOT/xxjProtocol]
            //1.1 设置默认键的值
            //@="TencentProtocol"
            //1.2 创建新键并制定值
            //"URL Protocol"="C://Program Files//Tencent//QQ//Timwp.exe"   
            RegKey key;
            key = new RegKey(@"HKEY_CLASSES_ROOT/xxjProtocol");
            key.RegValus = new List<RegValue>();
            key.RegValus.Add(new RegValue("@", "TencentProtocol", RegistryValueKind.String));
            key.RegValus.Add(new RegValue("URL Protocol", appPath, RegistryValueKind.String));
            keys.Add(key);

            //2.新建项
            //[HKEY_CLASSES_ROOT/xxjProtocol/DefaultIcon]
            //2.1 设置默认键的值
            //@="C://Program Files//Tencent//QQ//Timwp.exe,1"
            key = new RegKey(@"HKEY_CLASSES_ROOT/xxjProtocol/DefaultIcon");
            key.RegValus = new List<RegValue>();
            key.RegValus.Add(new RegValue("@", string.Format("{0},1", appPath), RegistryValueKind.String));
            keys.Add(key);

            //3.新建项
            //[HKEY_CLASSES_ROOT/xxjProtocol/shell]
            key = new RegKey(@"HKEY_CLASSES_ROOT/xxjProtocol/shell");
            keys.Add(key);

            //4.新建项
            //[HKEY_CLASSES_ROOT/xxjProtocol/shell/open]
            key = new RegKey(@"HKEY_CLASSES_ROOT/xxjProtocol/shell/open");
            keys.Add(key);

            //5.新建项
            //[HKEY_CLASSES_ROOT/xxjProtocol/shell/open/command]
            //5.1 设置默认键的值
            //@="/"C://Program Files//Tencent//QQ//Timwp.exe/" /"%1/""      
            key = new RegKey(@"HKEY_CLASSES_ROOT/xxjProtocol/shell/open/command");
            key.RegValus = new List<RegValue>();
            key.RegValus.Add(new RegValue("@", string.Format("{0} %1", appPath), RegistryValueKind.String));

            keys.Add(key);

            if (this.GeneratorReg(keys))
            {
                MessageBox.Show("注册成功!");
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            if (this.ClearProtocol("xxjProtocol"))
            {
                MessageBox.Show("清除成功!");
            }
        }

        #endregion
    }

    /// <summary>
    /// 注册表键值对象
    /// </summary>
    public class RegKey
    {
        public RegKey(string fullName)
        {
            FullName = fullName;
        }
        /// <summary>
        /// 注册表顶级节点对象
        /// </summary>
        ///  <remarks>创建人员(日期):★ben★(100916 15:06)</remarks>
        public RegistryKey rootKey
        {
            get
            {
                if (string.IsNullOrEmpty(FullName))
                {
                    throw (new Exception(string.Format("无效的注册表路径!{0}", FullName)));
                }
                if (FullName.ToUpper().IndexOf("HKEY_CLASSES_ROOT") > -1)
                    return Registry.ClassesRoot;
                else if (FullName.ToUpper().IndexOf("HKEY_CURRENT_USER") > -1)
                    return Registry.CurrentUser;
                else if (FullName.ToUpper().IndexOf("HKEY_LOCAL_MACHINE") > -1)
                    return Registry.CurrentUser;
                else if (FullName.ToUpper().IndexOf("HKEY_USERS") > -1)
                    return Registry.CurrentUser;
                else if (FullName.ToUpper().IndexOf("HKEY_CURRENT_CONFIG") > -1)
                    return Registry.CurrentUser;
                else
                    throw (new Exception(string.Format("无效的注册表路径!{0}", FullName)));
            }
        }
        /// <summary>
        /// 注册表完全路径名
        /// </summary>
        public string FullName { set; get; }
        /// <summary>
        /// 注册表完全路径下的键值集合
        /// </summary>
        public List<RegValue> RegValus {set;get; }
        /// <summary>
        /// 注册表子集节点路径
        /// </summary>
        public string SubKeyName
        {
            get
            {
                if (string.IsNullOrEmpty(FullName))
                {
                    throw (new Exception(string.Format("无效的注册表路径!{0}", FullName)));
                }

                return FullName.Substring(FullName.IndexOf(@"/") + 1);
            }
        }

    }
    /// <summary>
    /// 注册表值对象
    /// </summary>
    ///  <remarks>创建人员(日期):★ben★(100916 15:05)</remarks>
    public class RegValue
    {
        public RegValue(string keyName, string keyValue, RegistryValueKind keyValueKind)
        {
            KeyName = keyName;
            KeyValue = keyValue;
            KeyValueKind = keyValueKind;
        }
        /// <summary>
        /// 注册表键名称,默认节点名为""(空)或@
        /// </summary>
        public string KeyName { set; get; }
        /// <summary>
        /// 注册表值
        /// </summary>
        public string KeyValue { set; get; }
        /// <summary>
        /// 注册表值类型
        /// </summary>
        public RegistryValueKind KeyValueKind { set; get; }
    }
}
/*--------------------------------------------------------------------------------------*/

2.获取地址栏的内容
不管你需要运行的是winform 还是 console 程序,使用浏览器地址栏协议打开应用程序后,
如果想获取到地址栏内容,必须在 main 方法加上命令行参数。
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(args));
            //Application.Run(new Form2());
        }
    }
}

3.基本完成这两步操作,浏览器地址栏协议就已经完成了。

抱歉!评论已关闭.