适应环境:
操作系统:win7 家庭版,winxp
Qq版本:Qq2011,qq2011(安全保护)
原始需求:
因为公司的网络安全非常的严格,但是有的时候的确需要链接回公司干活。最初想找找合适的远程控制工具,但是多半都需要IP和端口一类的,而电脑在很深的内网,离外网的接口机都还有一段距离,要搞定网络配置颇为麻烦。于是考虑使用qq的远程控制功能。
具体实现思路:
离开公司的时候,开启qq,打开一个我在家使用qq的窗口,然后做一个工具每隔一段时间(比如30秒)就去看看qq窗口有没有命令发过来,如果接收到了命令,就进行相应的操作。
方案选择:
方案选择当然是在满足条件的基础上尽可能简单了,qtp和testcomplete都太复杂,难道为了这么简单的一个功能还要启动这么庞大的一个工具,显然杀鸡用牛刀了。试了试vbs,也不是太理想。这几个工具都面临一个问题,就是对象无法识别,本来用vbs想直接键盘操作,结果发现腾讯公司还是有对策,当做到申请控制的时候,键盘无法操作,即便用TAB切到按钮上,回车和空格不起作用,怎么样都不能按下按钮,只好作罢。要是调用鼠标点击,又是屏幕绝对坐标定位,适应性太差了。
最终翻了箱底,搜出来以前搞过的autoit,直接鼠标操作绕过对象识别算了。autoit的鼠标操作可以活动窗体的坐标系定位。
方案优缺点:
优点:
适应性好,不用识别对象,不管你是什么qq版本,只要基本流程一致,大不了修改一下每次点击的位置就行了。
缺点:
Qq的版本太多了,不同用户的qq窗口,远程协助按钮的位置在窗体中坐标都可能是不同的,分辨率影响,所以为了适应这么多不同,就得在配置文件中修改按钮<远程协助>、<确定>(qq2011有这个按钮,其他版本多半没有)、<申请控制>和<断开>在qq窗体中的相对坐标。
得,咱废话少说,就直接说工具的使用吧。
录制autoit键盘鼠标操作脚本工具:
http://download.csdn.net/detail/testingba/4583600
控制qq自动申请远程控制工具:
http://download.csdn.net/detail/testingba/4583605
相关的工具是两个:
第一个是自动控制qq的工具,里面有两个文件,一个是qqctl.exe,另一个是配置文件qqctl.ini,exe文件是可以更名的,不过同时ini修改文件名为一致的就可以了;
第二个是将键盘和鼠标操作自动录制为autoit脚本,这个是为了将配置文件修改的和实际情况一致使用的。
看看配置文件先:
[section1]
title1="title1"
x1=315
y1=65
x2=352
y2=107
x3=484
y3=426
x4=480
y4=420
x5=475
y5=456
解释一下:
Title1是qq窗体的名字,也就是主控端的那个qq的备注名字;
X1,y1,x2,y2是点击远程协助的坐标,为什么是两个呢,你看看下面的图就明白了:
001.jpg
X3,y3:是<确定>的坐标
X4,y4:是<申请受控>的坐标
X5,y5:是<断开>的坐标
Qq2011的整个交互过程是这样的:
A:被控端
B:主控端
A上的qq和B上的qq互相加为好友;
B启动qq,打开Aqq的窗口;
B启动程序;
A启动qq,打开Bqq,发送命令:远程协助
Bqq接收到<远程协助>的命令,就去点击远程协助;
Aqq接收到远程协助的请求,点击接受;
Bqq上弹出要求确定的按钮;
Aqq上发送<确定>命令;
Bqq接收到确定的请求,点击确定;
此时Aqq可以看到B的桌面了;
Aqq再发送<申请受控>的命令;
Bqq接收到申请受控的请求,点击申请受控按钮;
Aqq同意,整个过程就搞定了,要想中断可以直接叉掉,或者发送<断开>命令,控制Bqq点击断开按钮。
以上的测试很顺利的就在本机完成了。
等到用的时候,发现被控机的qq版本是qq2011(安全保护),交互过程是不同的。
主要区别是,远程协助的按钮不在子菜单下面,就直接是第一级按钮;
远程协助接受以后,Bqq端并不需要按确定按钮,就直接申请受控了。
解决法子:
X1,y1,x2,y2设置为同一个就是了,点击了申请协助后,再点一次没啥问题。
至于确定,你别发送确定的命令就行了。
录制工具的使用需要说明吗,好像不用了,太简单了,手工完成整个过程,录制好ini文件中需要的内容就行了。
记得那四条命令就行了:
远程协助
确定
申请受控
断开
另:
考虑了一些特殊使用场景,程序有一定的适应能力:
1. 比如B端界面上冒出来一个什么窗口,比如qq的弹出窗口挡住了Aqq的窗口,这个可以程序自动激活获得Aqq窗体的焦点;
2. 如果网络不稳定,突然断掉了,重新发起命令,照样可以重新连接;
脚本改进:
1. 断开命令是个傻帽命令,没有场景会用到,应该直接删除相关代码;
2. 控制好了以后,那个程序会老是去激活Aqq窗体,这个有些讨厌,退掉qqctl.exe,又怕中途断了连接不回来。
这个我是这么考虑的,增加两条新的命令<已经连接>和<已经中断>,当监控收到<已经连接>,就不再去激活窗体进行监控,如果中途断掉了,或者直接关闭了窗口,等网络能够连接了,就发送<已经中断>过去,监控收到命令,就重新监控其他几条命令,这么说不知道大家听懂了没有。回头自己尝试一下吧,我有空也写一个出来。
分析:这个想法是错误的,因为如果发送了<已经连接>,程序不再激活窗体监控,如何得知接收到了新的命令<已经中断>,一旦停止监控,就无法再继续监控了。所以必须监控qq进程相关的链接才行,链接掉了就是中断了控制,如果多个qq,只能监控到第一个启动的qq,虽然不够完美,但是可以限制监控的qq是第一个启动的来实现。
这里新写了一个监控qq是否远程监控的函数,测试通过:
#include <Constants.au3>
Func fQQcnt()
Local $strPid
Local $line
Local $blnCnt
$line=""
$blnCnt=False
$strPid=ProcessExists("qq.exe")
Local $foo = Run(@ComSpec & " /c netstat -ano -p TCP|find /i """ & $strPid & """|find /i ""ESTABLISHED""|find /V "":80 ""|find /V "":443 """, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD )
While 1
$line = $line & StdoutRead($foo)
If @error Then ExitLoop
Wend
if $line="" Then
$blnCnt=False
Else
$blnCnt=True
EndIf
Return $blnCnt
EndFunc
唉,这个方法还是错误的,因为在申请了远程协助以后,连接就已经建立了,而此时还没有申请控制,结果因为已经连接,停止监控的结果就是无法收到<申请受控>的命令了。
这个东西比我想象的复杂,得另外想法子了。总算想出法子来了,说穿了很简单,就是剪切图片进行比对。不过技术细节可就不是那么简单了,这个倒是很有用,图片比对呀,通用法子,还有啥搞不定的。等我倒腾出来了,回头另外开一篇。
好了,已经完善了,新写了一篇:
http://blog.csdn.net/testingba/article/details/8020020
这个脚本过于简单,没啥含金量,算了吧,懒得讲了,不过有兴趣的同学可以下载来参考参考。技术深浅不是最重要的,能解决问题最重要。
autoit3安装程序:
http://download.csdn.net/detail/testingba/4583878
命令控制qq自动申请远程控制代码:
http://download.csdn.net/detail/testingba/4583884
如果搞不定,可以qq:2310095680
进行交流