心羽 发表于 2018-12-14 09:51:07

在程序中打开QQ对话框——关于RegisterProtocol的简单应用

本帖最后由 心羽 于 2018-12-14 10:01 编辑

以前就注意到在网页上可以通过特殊的链接访问程序,如tecent:// thunder://,却不知道其中原理。

如今已经了解到,这种链接是使用了操作系统提供的访问本地程序的方法,称为RegisterProtocol,在对于 Windows、Linux 和 OS X 操作系统都可以注册这样的协议。
比如说 Windows,其实只需写入注册表,即可实现协议与执行程序的关联。
例如腾讯的协议注册表如下:

@=”TencentProtocol”
“URL Protocol”=”D:\\Program Files\\Tencent\\QQ\\Timwp.exe”

@=”D:\\Program Files\\Tencent\\QQ\\Timwp.exe,1″



@=”\”D:\\Program Files\\Tencent\\QQ\\Timwp.exe\” \”%1\”"



注册表内容在HKEY_CLASS_ROOT下,TENCENT即对应协议头 tencent://,....\shell\open\command键值代表运行某exe,将第一个参数传入程序,也就是网址本身。

所以了解到2个有用的事情:

1.如果想通过自己的应用程序或网页访问到QQ或者迅雷,这种自定义了RegisterProtocol的程序,访问起来都比较方便(网页访问还没研究)。本地程序访问可以直接在注册表中查找“HKEY_CLASS_ROOT\xxx”。
2.自己写的程序也可以定义RegisterProtocol


再记录一下几个事情:
1.想获得QQ的推广链接需要在腾讯推广的页面上注册 http://shang.qq.com/v3/index.html,需要通过授权才能让陌生人在不加好友的情况下与你聊天。否则,这个功能现在只能与自己的好友对话
2.推广链接是 http://wpa.qq.com/msgrd?v=3&uin=(QQ号码)&site=qq&menu=yes
3.TencentProtocol的使用格式 tencent://message/?uin=(QQ号码)&Menu=yes


最后是尝试着实现功能的部分

今天使用Adobe AIR for Desktop实现了一下打开与好友聊天窗口的功能,再次熟悉了一下NativeProcess的使用方法。

NativeProcess只能访问exe。每个NativeProcess都会打开一个进程。因此传入cmd.exe的路径即可使用命令行工具

var n:NativeProcess = new NativeProcess();
n.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutput);
n.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onError);
var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
info.executable = new File("c://windows//System32//cmd.exe");

n.start(info);

在onOutput函数接收到cmd的输出后,命令行启动完毕,就可以输入下一步命令,查找注册表了
var cmd:String = 'reg query "HKEY_CLASSES_ROOT\\Tencent" /v "URL Protocol" \n';

n.standardInput.writeMultiByte(cmd, "utf-8");
注意命令中的\n,没有回车输入,是不会产生输出结果的

然后onOutput函数再次输出一堆信息,提取有用的输出,获取exe路径
再创建一个访问qq程序的进程,将TencentProtocol的链接传入,功能就完整实现了。(代码示例中使用123456789代替实际QQ号)


             if (str.indexOf("Timwp.exe") > -1) {
      //字符串处理写的比较烂。。见谅。。
      var idx:int = str.lastIndexOf(":");
      var exeIdx:int = str.lastIndexOf(".exe");
      var path:String = str.substr(idx-1, exeIdx - idx + 5).replace(/\\/g, "//");
      trace("Path:" + path);      

      var tencentFile:File = new File(path);
      trace(tencentFile.exists);
      if(tencentFile.exists) {
                var startQQcmd:String = "tencent://message/?uin=123456789&Menu=yes";      
                var tencentProcess:NativeProcess = new NativeProcess();
                var tencentInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                tencentInfo.executable = tencentFile;
                tencentInfo.arguments.push(startQQcmd);   
                tencentProcess.start(tencentInfo);
      }
}   
现在,(QQ已登录后)运行起来后就可以打开该好友的对话框了。

尝试输入自己的QQ号后启动程序,弹出这样的提示....


如果要在web端做实验,可以先尝试在浏览器地址栏中输入:
tencent://message/?uin=123456789&Menu=yes
在IE下没问题,在Chrome下却不好用,还没搞清楚为什么,以后再补充吧

附上测试代码源码:

**** Hidden Message *****







最后一批aser 发表于 2018-12-20 10:51:36

棒棒噠(應作者要求來捧場){:1_122:}{:1_122:}{:1_122:}

心羽 发表于 2018-12-20 10:57:02

最后一批aser 发表于 2018-12-20 10:51
棒棒噠(應作者要求來捧場)

{:5_177:}好人!

最后一批aser 发表于 2018-12-20 11:17:30

本帖最后由 最后一批aser 于 2018-12-20 11:22 编辑

@TKCB

{:7_210:}
页: [1]
查看完整版本: 在程序中打开QQ对话框——关于RegisterProtocol的简单应用

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)