【关闭窗口】 
进入ooReport网上直报数据分析
版权所有:济南昂利万软件开发有限公司 http://www.etcell.com/
  您的位置:首页 -> 重要通知通令
搜索:
最新主题  10
【期货市场技术分析】完整版——约翰.墨菲.pdf
垂直搜索引擎现身招投标领域--招标搜索网
ooReport平台支持的自定义查询,支持各种数据库分页机制示例!!
妥妥贴贴
由Tencent://Message协议想到的一个解决方案(QQ在线)
Tencent://Message/协议的实现原理
浏览器HTTP_USER_AGENT汇总——Firefox、Chrome、IE9、IE8、IE7、IE6
ooReport平台中的WinTable报表设计器是个自定义报表工具
国家统计局调查队数据采集平台-ooReport平台实现,城镇住户调查手机报送 河南省 平顶山 统计局调查队 数据采集系统平台
燃料管理系统ppt
主  题: 由Tencent://Message协议想到的一个解决方案(QQ在线)
重 要 性:
发布日期: 2012/4/7 0:05:56
发 布 人: 青岛分公司(OS02DE0102@OS02)
回 复 数: 0
人气指数: 2389点
由Tencent://Message协议想到的一个解决方案(QQ在线)
2011-07-30 22:14

今天在试用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,有心的朋友请试试看。


 
 



软件制作:济南昂利万软件开发有限公司 © 2004-2009