11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2990|回复: 3
上一主题 下一主题

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

[复制链接] TA的其它主题
发表于 2018-12-14 09:51:07 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

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

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

QQ截图20181214095822.png

注册表内容在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的路径即可使用命令行工具

[Actionscript3] 纯文本查看 复制代码
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的输出后,命令行启动完毕,就可以输入下一步命令,查找注册表了
[Actionscript3] 纯文本查看 复制代码
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号)


            
[Actionscript3] 纯文本查看 复制代码
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);        
[attach]1450[/attach]
        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号后启动程序,弹出这样的提示....

尝试输入自己的QQ号后,弹出提示

尝试输入自己的QQ号后,弹出提示


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

附上测试代码源码:

游客,如果您要查看本帖隐藏内容请回复








评分

参与人数 1银子 +66 收起 理由
最后一批aser + 66 11RIA six six six.(666)

查看全部评分

发表于 2018-12-20 10:51:36 | 显示全部楼层
棒棒噠(應作者要求來捧場)
回复

使用道具 举报

 楼主| 发表于 2018-12-20 10:57:02 | 显示全部楼层
最后一批aser 发表于 2018-12-20 10:51
棒棒噠(應作者要求來捧場)

好人!
回复

使用道具 举报

发表于 2018-12-20 11:17:30 | 显示全部楼层
本帖最后由 最后一批aser 于 2018-12-20 11:22 编辑

@TKCB


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的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)



快速回复 返回顶部 返回列表