专注于开源技术的研究与应用由Tencent://Message协议想到的一个解决方案

2023-10-31

源代码下载:http://files.cnblogs.com/phinecos/HelloWorldProtocal.rar

前天在BruceZhang 的一篇博文《求助:如何在ASP页面中调用Winform程序呢?》中回答了他提出的问题,但细想下觉得我的思路有误。

    今天在试用WebQQ的时候,无聊中想起很多人的博客上都有这样的小玩意, ,  点击下就可以和博主进行对话,而且无需加博主为好友。

哎,这样的方式不就正好是BruceZhang那个问题的解决方案吗?那么腾讯是怎么做到在Web页面中调用QQ程序的呢?

先来看腾讯提供给我们的代码:

< href ="tencent://message/?uin=88888888&Site=JooIT.com&Menu=yes" >
< img  border ="0"  SRC ='http://is.qq.com/webpresence/images/status/01_online.gif'  alt ="点击这里给我发消息" >
</ a >

    很显然,奥妙就在“tencent://message/?uin=215555521&Site=JooIT.com&Menu=yes”这里,那这又到底是什么原理呢?

先扯开话题按自己的思路来想,要打开本地的QQ,肯定要分两步走,首先是定位到QQ,然后是传递给它一些参数,也就是“uin=215555521&Site=JooIT.com&Menu=yes”这样的东西。定位的话,借助注册表是最明显的方式了。可怎么把QQ跑起来呢?要我们自己去启动一个进程么?答案是否定的,Windows操作系统考虑了这一点,允许我们为自己的应用程序注册为一个协议处理者,具体参见MSDN上的文章《Registering an Application to a URL Protocol

腾讯的Tencent://Message协议注册表如下:

Windows Registry Editor Version  5.00

[HKEY_CLASSES_ROOT\Tencent]
@= " TencentProtocol "
" URL Protocol " = " D:\\Program Files\\Tencent\\QQ\\Timwp.exe "

[HKEY_CLASSES_ROOT\Tencent\DefaultIcon]
@= " D:\\Program Files\\Tencent\\QQ\\Timwp.exe,1 "

[HKEY_CLASSES_ROOT\Tencent\shell]

[HKEY_CLASSES_ROOT\Tencent\shell\open]

[HKEY_CLASSES_ROOT\Tencent\shell\open\command]
@= " \ " D:\\Program Files\\Tencent\\QQ\\Timwp.exe\ "  \ " % 1 \ ""

 此注册表所实现的就是当浏览器(或其它)碰到 tencent://… 时,自动调用 Timwp.exe,并把 tencent://… 地址作为第一个参数传递给 Timwp.exe。

 废话不多说,下面就动手实验一个demo来说明一切,源代码请在文章首部自行下载。 很简单的功能,就是显示传递给MFC Dialog程序的参数值。就只分析下我添加的代码:

     首先需要获取传入的参数,在控制台程序中我们都知道main()函数的参数argv里带入了传入的参数,而在MFC程序中则需要在InitInstance()中进行命令行参数解析。

    CCommandLineInfo   cmdInfo;   
    ParseCommandLine(cmdInfo);

     为了给对话框传入待显示的参数,加入了一个SetDisplayInfo方法。

    CHelloWorldDlg dlg;
    dlg.SetDisplayInfo(cmdInfo.m_strFileName);
// 设置待显示的信息

 

void  CHelloWorldDlg::SetDisplayInfo(CString &  strInfo)
{
    
this -> m_strInfo  =  strInfo;
}

     最后在OnInitDialog函数中进行参数解析

     // 解析传入的完整地址,e.g "helloworld: // hello world/"
     int  pos  =  m_strInfo.Find( " // " ); // 找到分隔符
    m_strInfo  =  m_strInfo.Mid(pos + 2 ); // 取到传入的参数
    m_strInfo.Delete(m_strInfo.GetLength() - 1 ); // 去掉最后的'/'
    m_edit_info.SetWindowText(m_strInfo);

     好了,来到最关键的步骤了,在注册表中为我们自定义的helloworld协议建立起注册表项,从而让HelloWorld应用程序支持此协议。将如下的注册表项加入即可,这里为了简单起见我直接用一个.reg文件来实现,也可以用其他方式进行:

Windows Registry Editor Version  5.00

[HKEY_CLASSES_ROOT
\ HelloWorld]
@
= " HelloWorld Protocol "
" URL Protocol " = ""

[HKEY_CLASSES_ROOT
\ HelloWorld \ DefaultIcon]
@
= " D:\\My Documents\\Visual Studio 2005\\Projects\\HelloWorld\\release\\HelloWorld.exe,1 "

[HKEY_CLASSES_ROOT
\ HelloWorld \ shell ]
@
= ""

[HKEY_CLASSES_ROOT
\ HelloWorld \ shell \ open]
@
= ""

[HKEY_CLASSES_ROOT
\ HelloWorld \ shell \ open \ command ]
@
= " \ " D: \\ My Documents \\ Visual Studio  2005 \\ Projects \\ HelloWorld \\ release \\ HelloWorld . exe \ "  \ " %1 \ ""

 结果如图所示

 

     好了,这下可以来测试helloworld协议了,在地址栏中输入:helloworld://hello world/,怎么样,下面的画面出来了吧,

     再来到web页面进行测试,修改上面的html代码如下:

< html >
< head ></ head >
< body >
< div >
< href ="helloworld://hello world" >
< img  border ="0"  SRC ='http://is.qq.com/webpresence/images/status/01_online.gif'  alt ="点击这里给我发消息" >
</ a >
</ div >
</ body >
</ html >

    若是要在web页面调用本地的winform程序,同理也是可行,不过我不大懂.net,有心的朋友请试试看。

参考资料:

1, Registering an Application to a URL Protocol

2, Tencent://Message/协议的实现原理

3,仿腾讯 QQ 和 Skype 通过URL触发自己的程序

4,Register protocol

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从 Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL
 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

专注于开源技术的研究与应用由Tencent://Message协议想到的一个解决方案 的相关文章

随机推荐

  • STLINK,ST-LINK Utility无法连接单片机

    STLINK ST LINK Utility无法连接单片机 keil ST LINK Utility尝试连接最小系统板 但是无法连接 网上搜了很多教程 偶然看到一位道友说他连接空板子可以 有程序的不行 不知道为什么 因为我的板子之前也下载过
  • 中断INT 0x80的作用[转自csdn blog]

    当进程执行系统调用时 先调用系统调用库中定义某个函数 该函数通常被展开成前面提到的 syscallN的形式通过INT 0x80来陷入核心 其参数也将被通过寄存器传往核心 在这一部分 我们将介绍INT 0x80的处理函数system call
  • Python 计算机视觉

    Python 计算机视觉 from PIL import Image Image是PIL中比较重要的一个 模块 im Image open F Desktop 今日须看 代码 Python master back image bmp ims
  • python画散点图、折线图

    Python 画图 散点图scatter 保存savefig 及颜色大全 python中的散点图还可以这么画 这个针对改变描点形状 一 散点图 import numpy as np import matplotlib pyplot as p
  • MySQL之锁的使用

    MySQL表级锁的锁模式 MySQL的表级锁有两种模式 表共享读锁 Table Read Lock 和表独占写锁 Table Write Lock 锁模式的兼容性 对MyISAM表的读操作 不会阻塞其他用户对同一表的读请求 但会阻塞对同一表
  • Qt 类中Q_OBJECT的作用及其程序代码体现

    Qt中类里为什么要加上Q OBJECT这个东西呢 原来这是一个Qt定义的宏 它的作用是什么呢 原来这个宏中包含了Qt中最重要的一个机制 也就是信号和槽的机制 所有的Qt程序一定会使用这个机制 下面我们可以先看一个简单的小程序 一个类似于图片
  • c++自定义sort()函数的排序方法

    1 引言 在C 中 sort 函数常常用来对容器内的元素进行排序 先来了解一下sort 函数 sort 函数有三个参数 第一个是要排序的容器的起始迭代器 第二个是要排序的容器的结束迭代器 第三个参数是排序的方法 是可选的参数 默认的排序方法
  • Spring/Spring boot中静态变量赋值

    情形1 静态变量为自动注入的对象 解决方案 设置两个变量 非静态变量使用 resource注入Bean 然后使用 PostConstruct在Spring初始化Bean成功后为静态变量赋值 Component public class XX
  • sql语句直接执行很快,java程序执行慢

    一次线上Case 一条联合查询语句 直接在sql server查询分析器执行 1秒以内 通过java程序执行很慢要7秒返回结果 贴出sql 语句 select temp id temp userId temp operationUserId
  • 紫枫术河 imx6 uboot的mtd分区总结(rootfs为ubi文件系统) imx6 uboot的mtd分区总结(rootfs为ubi文件系统)

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net qq 29729577 article details 51130209 此文章基于U Boot 2014 04版本 烧写工具为mfgtool 开发
  • 蓝桥杯每日一题(18):李白打酒(python)

    Topic 话说大诗人李白 一生好饮 幸好他从不开车 一天 他提着酒壶 从家里出来 酒壶中有酒2斗 他边走边唱 无事街上走 提壶去打酒 逢店加一倍 遇花喝一斗 这一路上 他一共遇到店5次 遇到花10次 已知最后一次遇到的是花 他正好把酒喝光
  • ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理 1 首先ecshop是如何定义ajax对象的 ecshop中的ajax对象是在js transport js文件中定义的 里面是ajax对象文件 声明了一个var Ajax Transport 对象和一个方
  • 大坝安全监测有哪些监测项目

    大坝安全监测有 工程主体结构 地基基础 两岸边坡 相关设施以及周围环境所作的测量及观察 也包括对建筑物外表及内部大范围对象的定期或不定期的直观检查和仪器探查 通过观测仪器和设备 以及时取得反映大坝和基岩性态变化以及环境对大坝作用的各种数据的
  • centos6.5搭建贴吧云签到平台(多图预警)

    前提 我已经用oneinstack服务搭建好了主机环境LNAMP Linux NginxApache Mysql php 默认目录是 data wwwroot default 详细步骤 1 先下载要安装的文件 我用的是GitHub上star
  • 虚拟机vmware安装win10提示operating system not found解决办法

    首先如果启动提示进入BIOS 则删除下述文件的efi 首先先设置启动PE镜像 加载启动盘PE ISO后进入PE 将系统镜像复制到U盘 PE里先分区 然后再安装 PE里安装完后重启 后面的步骤按自动的即可
  • postman循坏调用接口

    postman循坏调用接口 新建一个Collections 在新建的Collections里面新建需要循环的接口 将需要循坏变化的参数设置成变量 设置好变量之后 运行整个collections 变量值的数量应该与迭代次数一致 可以导入jso
  • YOLOv5+单目测距(python)

    YOLOv5 单目测距 python 1 相关配置 2 测距原理 3 相机标定 3 1 标定方法1 3 2 标定方法2 4 相机测距 4 1 测距添加 4 2 细节修改 可忽略 4 3 主代码 5 实验效果 相关链接 1 YOLOV7 单目
  • python ttk Treeview的插入、清空、各种点击事件、获取条目值、标题单击排序

    昨天整了一天Tkinter的treeview 发现中文的教程乃至提问都很少 其中两个问题的解决都是靠steakoverflow上找到的 在这里放出来我遇到并解决的问题 大家以后可能遇到的话就能省点事了 插入方法 import tkinter
  • 第二章-Kali安装

    目录 2 Kali Linux安装 硬盘安装 虚拟机安装 01硬盘安装 02DOCKER 03虚拟机安装 3 Kali Linux 安装 持久加密USB安装 熟悉环境 熟悉BASH命令 01 持久加密USB安装 1 02 持久加密USB安装
  • 专注于开源技术的研究与应用由Tencent://Message协议想到的一个解决方案

    源代码下载 http files cnblogs com phinecos HelloWorldProtocal rar 前天在BruceZhang 的一篇博文 求助 如何在ASP页面中调用Winform程序呢 中回答了他提出的问题 但细想