由Tencent://Message协议想到的一个解决方案
副标题#e#
前天在BruceZhang 的一篇博文《求助:如安在ASP页面中挪用Winform措施呢?》中回 答了他提出的问题,但细想下以为我的思路有误。
本日在试用WebQQ的时候,无聊 中想起许多人的博客上都有这样的小玩意, , 点击下 就可以和博主举办对话,并且无需加博主为挚友。
哎,这样的方法不就正好是 BruceZhang谁人问题的办理方案吗?那么腾讯是怎么做到在Web页面中挪用QQ措施的呢?
先来看腾讯提供应我们的代码:
<a href="tencent://message/? uin=88888888&Site=JooIT.com&Menu=yes">
<img border="0" SRC='/uploads/2011/1104/0QQQ032-1.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_ROOTTencent]
@="TencentProtocol"
"URL Protocol"="D:\Program Files\Tencent\QQ\Timwp.exe"
[HKEY_CLASSES_ROOTTencentDefaultIcon]
@="D:\Program Files\Tencent\QQ\Timwp.exe,1"
[HKEY_CLASSES_ROOTTencentshell]
[HKEY_CLASSES_ROOTTencentshellopen]
[HKEY_CLASSES_ROOTTencentshellopencommand]
@=""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);
#p#副标题#e#
好了,来到最要害的步调了,在注册表中为我们自界说的helloworld协议成立起注册 表项,从而让HelloWorld应用措施支持此协议。将如下的注册表项插手即可,这里为了简 单起见我直接用一个.reg文件来实现,也可以用其他方法举办:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTHelloWorld]
@="HelloWorld Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOTHelloWorldDefaultIcon]
@="D:\My Documents\Visual Studio 2005 \Projects\HelloWorld\release\HelloWorld.exe,1"
[HKEY_CLASSES_ROOTHelloWorldshell]
@=""
[HKEY_CLASSES_ROOTHelloWorldshellopen]
@=""
[HKEY_CLASSES_ROOTHelloWorldshellopencommand]
@=""D:\My Documents\Visual Studio 2005 \Projects\HelloWorld\release\HelloWorld.exe" "% 1""
功效如图所示
好了,这下可以来测试helloworld协议了,在地点栏中输入:helloworld://hello world/,怎么样,下面的画面出来了吧,
再来 到web页面举办测试,修改上面的html代码如下:
#p#分页标题#e#
<html>
<head></head>
<body>
<div>
<a href="helloworld://hello world">
<img border="0" SRC='/uploads/2011/1104/0QQQ032-1.gif' alt="点击这里给我动员静">
</a>
</div>
</body>
</html>
若是要在web页面挪用当地的winform措施,同理也是可行 ,不外我不大懂.net,有心的伴侣请试试看。