由Tencent://Message协议想到的一个解决方案

news/2024/11/6 23:23:02/

源代码下载: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://www.ppmy.cn/news/601548.html

相关文章

Tencent://Message/协议

腾讯官方通过 Tencent://Message/协议可以让QQ用户显示QQ/TM的在线状态发布在互联网上&#xff1b;并且点击 XXX &#xff0c;不用加好友也可以聊天官方链接&#xff1a; http://is.qq.com/webpresence/code.shtml 具体代码&#xff1a; | < img border"0" SRCht…

Tencent SSL 数字证书安装部署

目录 前言一、SSL 证书购买二、配置监听器三、Nginx SSL 配置FAQ 前言 之前写了一篇关于 SSL 证书的文章《Nginx 自签证书实现80转443》&#xff0c;不过这是自签证书的形式进行部署的&#xff0c;尽管能正常访问&#xff0c;但依然显示是不安全的&#xff0c;因为自签证书是得…

QQ的Tencent://Message/协议

QQ即时聊天代码 *********为QQ号码 以前这样写&#xff1a;http://wpa.qq.com/msgrd?V1&Uin*********&Sitehexun.com/ngdao&Menuyes" 现在这样写&#xff1a;tencent://message/?uin*********&Sitehexun.com/ngdao&Menuyes tencent://message/?…

com.tencent.tinker.build.util.TinkerPatchException:

Execution failed for task :app:tinkerPatchRelease. > com.tencent.tinker.build.util.TinkerPatchException: There are fatal reasons that cause Tinker interrupt patch generating procedure, see logs above. 错误记录下面是log日志 打补丁包一直没有成功 &#xf…

关于腾讯的Tencent://Message/协议

我们知道&#xff0c;很多网站的在线QQ客服是通过 Tencent://Message/协议实现的&#xff0c;类似的实现还有迅雷、快播...下载链接等。 那么这是什么原理呢&#xff1f; 经过一番google&#xff0c;博主发现&#xff1a; 微软官方说明&#xff1a;http://msdn.microsoft.com…

开源推荐,腾讯正式开源 Spring Cloud Tencent

一、为什么要做 Spring Cloud Tencent Spring Boot Spring Cloud 仍是 Java 生态最主流的框架 2014 年 4 月 Spring Boot 发布 1.0 版本&#xff0c;经过 8 年时间的发展&#xff0c;Spring Boot 已然成为 Java 开发框架的事实标准。在分布式微服务领域&#xff0c;2016 年 …

手动集成Tencent SDK遇到的坑!!!

手动集成的原因 由于腾讯未把Tencent SDK上传到Github中&#xff0c;所以我们不能通过Cocoapods的方式集成&#xff0c;只能通过官方下载其SDK手动集成。 Tencent SDK手动集成步骤 1.访问腾讯开放平台SDK下载界面&#xff0c;找到并下载iOS_SDK_V3.5.1。&#xff08;目前最新…

Econ3116-econ5116-week5知识点精讲-规模经济、垄断竞争与贸易

对本文有疑问可以加微信 Tutor_0914联系。也可以访问我的个人辅导网站 &#xff1a; tutoryou 总结 这节课的topic本人总结如下&#xff1a; 了解规模经济、垄断竞争和贸易之间的关系&#xff0c;以及如何用垄断竞争模型分析国际贸易的影响 了解生产者异质性、垄断竞争和贸易…