很多人的博客都有这样的小玩意,点击之后就可以直接与博主进行对话,而且无需添加好友。
先研究一下网页源代码:
<a href="tencent://message/?uin=88888888&Site=qq&Menu=yes">联系我</a>
很明显,奥妙就在这个超链接中,先按照自己的思路来想,要打开本地 QQ,肯定分两步走:
- 定位 QQ 软件路径
- 传递给它一些参数启动
可怎么把QQ 跑起来呢,需要我们自己去启动一个线程吗?答案是否定的,Windows 操作系统考虑到了这一点,允许我们为自己的应用程序注册一个协议,具体参见:Registering an Application to a URI Scheme
分析
腾讯的 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
HKEY_CLASSES_ROOT\Tencent
:Tencent 就是协议名字HKEY_CLASSES_ROOT\Tencent\shell\open\command
:内部定义的地址来启动软件
实现
基于上述前提,我们编写如下 .reg 文件
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\Demo]
@="MyDemo"
"URL Protocol"=""
[HKEY_CURRENT_USER\Software\Classes\Demo\shell\open\command]
@="\"C:\\Users\\zzzzls\\Desktop\\demo.exe\" \"%1\""
// demo.exe
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
for (int i=0;i<=argc;i++){
printf("%s\n", argv[i]);
}
system("pause");
return 0;
}
浏览器输入:demo://run
程序执行: