zoukankan      html  css  js  c++  java
  • 由Tencent://Message协议想到的一个解决方案

    源代码下载:https://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

    posted on 2009-03-06 21:48 Phinecos(洞庭散人) 阅读(1104) 评论(11)  编辑 收藏 网摘 所属分类: C/C++/VC++

    评论

    #1楼  2009-03-06 22:01 沉默杨仔      

    不错不错.等下去试试.WEB to client的解决方案..   回复  引用  查看    

    #2楼  2009-03-07 01:26 ppchen(陈荣林)      

    .net中可以把winform程序发布成SmartClient,这样就可以轻松地在网页上调用到.net程序,客户端程序还可以得到版本更新,不过要求客户端安装有Framework   回复  引用  查看    

    #3楼  2009-03-07 08:53 要有好的心情      

    不错。

    客户端什么要不要装,特别是 .net Framework   回复  引用  查看    

    #4楼  2009-03-07 09:09 侯垒      

    不错。   回复  引用  查看    

    #5楼 [楼主] 2009-03-07 09:14 Phinecos(洞庭散人)      

    @要有好的心情
    我这是调用MFC程序,不需要.net framework,   回复  引用  查看    

    #6楼 [楼主] 2009-03-07 09:15 Phinecos(洞庭散人)      

    @ppchen(陈荣林)
    呵呵,对.net不了解,看来SmartClient还不错,那它背后的原理又是怎样的呢?还需要借助注册表去定位程序位置么?   回复  引用  查看    

    #7楼  2009-03-07 09:43 canbeing      

    恩,要注册协议。
    貌似在Firefox下,这个协议是不生效的   回复  引用  查看    

    #8楼 [楼主] 2009-03-07 15:17 Phinecos(洞庭散人)      

    @canbeing
    你错了,你试试在firefox里输入:tencent://message/?uin=88888888&Site=JooIT.com&Menu=yes,一样是可以启动QQ的!!!具体分析见:http://kb.mozillazine.org/Register_protocol
      回复  引用  查看    

    #9楼  2009-03-07 15:45 瑞星杀机软件 [未注册用户]

    @canbeing
    您说的没错,只能IE   回复  引用    

    #10楼  2009-03-07 15:50 瑞星杀机软件 [未注册用户]

    @瑞星杀机软件
    看来3.0以上版本改良了   回复  引用    

    #11楼  2009-03-07 20:21 Yoshow      

    这一招酷, 收藏了先.   回复  引用  查看    

  • 相关阅读:
    2018年2月1日学习总结
    2018年1月31日学习总结
    创建oracle数据库表空间和用户
    广播权限声明
    广播接收器
    Android的屏幕限定符
    hibernate学习笔记(3)hibernate常用配置以及session对象
    hibernate学习笔记(2)持久化类测试
    hibernate学习笔记(1)基础配置与jar包
    struts2学习笔记(5)拦截器
  • 原文地址:https://www.cnblogs.com/zxjyuan/p/1405703.html
Copyright © 2011-2022 走看看