C# 自定义 web 的uri 协议 并接收参数

_小黑_ 2016-08-06 02:48:13
RT C# winform 如何自定义 uri 协议 并且 接收 web 传来的参数呢
类似于 打开 一个网站 使用QQ 交谈 他就会 打开 本地的QQ 进行会话
...全文
286 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2016-08-06
  • 打赏
  • 举报
回复
所谓的协议只是uri中第一个冒号前面的字符串 你可以通过Uri.Scheme获得它 https://msdn.microsoft.com/zh-cn/library/azure/system.uri.scheme.aspx 比如我可以自由的创建一个csharp协议:
Uri uri = new Uri("csharp://bbs.csdn.net");
所以要根据不同的协议做不同的操作 你只需要取得uri.Scheme,然后判断并操作即可 之所以qq会自动弹出来是因为你在安装的时候它已经帮各大浏览器都注册好了协议而已 在注册表HKEY_CLASSES_ROOT里 如果你只是开发自己的应用程序,不用鸟windows这套
_小黑_ 2016-08-06
  • 打赏
  • 举报
回复
引用 1 楼 Forty2 的回复:
安装QQ的时候,安装程序同时登记了它的协议。 主要原理是在注册表的HKEY_CLASSROOT下,加入一定的键。 新建一个WinForm的项目,拷入以下代码(namespace要改),就可以直接运行了。 登记时运行需要管理员权限,登记后就’登记代码’就没有用,可以删掉了。 测试一: Windows开始 - 运行 - 输入 myqq:helloworld 并回车即可看见WinForm程序。 测试二: 在网页代码中插入类似 <a href="myqq:nihao">开启myqq</a>链接。在浏览器中点击链接,(安全提示后)可以启动WinForm程序。

using Microsoft.Win32;
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = Environment.CommandLine.Split(' ').Last();

            Load += delegate
            {
                try
                {
                    RegisterUriScheme("myqq", this.GetType().Assembly.Location);
                }
                catch (Exception e)
                {
                    MessageBox.Show("需要管理员权限。myqq协议注册错误:" + e.Message);
                }
            };
        }

        public static void RegisterUriScheme(string scheme, string applicationPath)
        {
            string filename = Path.GetFileName(applicationPath);
            using (var schemeKey = Registry.ClassesRoot.CreateSubKey(scheme, writable: true))
            {
                schemeKey.SetValue("", "URL:myqq Protocol");
                schemeKey.SetValue("URL Protocol", "");

                using (var defaultIconKey = schemeKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", filename + ",1");
                }
                using (var shellKey = schemeKey.CreateSubKey("shell"))
                using (var openKey = shellKey.CreateSubKey("open"))
                using (var commandKey = openKey.CreateSubKey("command"))
                {
                    commandKey.SetValue("", string.Format("\"{0}\" \"%1\"", applicationPath));
                }
            }
        }
    }
}
具体的请原理参考: Registering an Application to a URI Scheme https://msdn.microsoft.com/zh-cn/library/aa767914(v=vs.85).aspx
哦 看明白了 谢谢 我想问一下 如果 已经 存在 这个键 了 在创建 会报错吗
_小黑_ 2016-08-06
  • 打赏
  • 举报
回复
引用 1 楼 Forty2 的回复:
安装QQ的时候,安装程序同时登记了它的协议。 主要原理是在注册表的HKEY_CLASSROOT下,加入一定的键。 新建一个WinForm的项目,拷入以下代码(namespace要改),就可以直接运行了。 登记时运行需要管理员权限,登记后就’登记代码’就没有用,可以删掉了。 测试一: Windows开始 - 运行 - 输入 myqq:helloworld 并回车即可看见WinForm程序。 测试二: 在网页代码中插入类似 <a href="myqq:nihao">开启myqq</a>链接。在浏览器中点击链接,(安全提示后)可以启动WinForm程序。

using Microsoft.Win32;
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = Environment.CommandLine.Split(' ').Last();

            Load += delegate
            {
                try
                {
                    RegisterUriScheme("myqq", this.GetType().Assembly.Location);
                }
                catch (Exception e)
                {
                    MessageBox.Show("需要管理员权限。myqq协议注册错误:" + e.Message);
                }
            };
        }

        public static void RegisterUriScheme(string scheme, string applicationPath)
        {
            string filename = Path.GetFileName(applicationPath);
            using (var schemeKey = Registry.ClassesRoot.CreateSubKey(scheme, writable: true))
            {
                schemeKey.SetValue("", "URL:myqq Protocol");
                schemeKey.SetValue("URL Protocol", "");

                using (var defaultIconKey = schemeKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", filename + ",1");
                }
                using (var shellKey = schemeKey.CreateSubKey("shell"))
                using (var openKey = shellKey.CreateSubKey("open"))
                using (var commandKey = openKey.CreateSubKey("command"))
                {
                    commandKey.SetValue("", string.Format("\"{0}\" \"%1\"", applicationPath));
                }
            }
        }
    }
}
具体的请原理参考: Registering an Application to a URI Scheme https://msdn.microsoft.com/zh-cn/library/aa767914(v=vs.85).aspx
writable 这个参数 是什么?
Forty2 2016-08-06
  • 打赏
  • 举报
回复
安装QQ的时候,安装程序同时登记了它的协议。 主要原理是在注册表的HKEY_CLASSROOT下,加入一定的键。 新建一个WinForm的项目,拷入以下代码(namespace要改),就可以直接运行了。 登记时运行需要管理员权限,登记后就’登记代码’就没有用,可以删掉了。 测试一: Windows开始 - 运行 - 输入 myqq:helloworld 并回车即可看见WinForm程序。 测试二: 在网页代码中插入类似 <a href="myqq:nihao">开启myqq</a>链接。在浏览器中点击链接,(安全提示后)可以启动WinForm程序。

using Microsoft.Win32;
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = Environment.CommandLine.Split(' ').Last();

            Load += delegate
            {
                try
                {
                    RegisterUriScheme("myqq", this.GetType().Assembly.Location);
                }
                catch (Exception e)
                {
                    MessageBox.Show("需要管理员权限。myqq协议注册错误:" + e.Message);
                }
            };
        }

        public static void RegisterUriScheme(string scheme, string applicationPath)
        {
            string filename = Path.GetFileName(applicationPath);
            using (var schemeKey = Registry.ClassesRoot.CreateSubKey(scheme, writable: true))
            {
                schemeKey.SetValue("", "URL:myqq Protocol");
                schemeKey.SetValue("URL Protocol", "");

                using (var defaultIconKey = schemeKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", filename + ",1");
                }
                using (var shellKey = schemeKey.CreateSubKey("shell"))
                using (var openKey = shellKey.CreateSubKey("open"))
                using (var commandKey = openKey.CreateSubKey("command"))
                {
                    commandKey.SetValue("", string.Format("\"{0}\" \"%1\"", applicationPath));
                }
            }
        }
    }
}
具体的请原理参考: Registering an Application to a URI Scheme https://msdn.microsoft.com/zh-cn/library/aa767914(v=vs.85).aspx

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧