话说前一篇:
http://blog.csdn.net/testingba/article/details/8003679
没有成功解决:
2. 控制好了以后,那个程序会老是去激活Aqq窗体,这个有些讨厌,退掉qqctl.exe,又怕中途断了连接不回来。
想了两个方法,都有问题,现在彻底解决了问题,可以实现使用场景:
依次发送命令<远程协助>、<确定>(qq2011版)和<申请控制>使得Aqq主动申请受控,当受控后,A端弹出消息框提示:现在可以操作了。在操作过程中,不会再激活Aqq读信息,当操作完毕或者中途网络断开后,程序监测到qq网络链接中断,重新开始监控Aqq窗体,Bqq可以再次发送命令去申请控制Aqq。
好了,进入正题,说说怎么个搞法:
整个系统的文件清单:
Qqctl.au3:主程序
Qqctl.ini:主程序配套的配置文件
Getcaptureimg.au3:抓屏工具
Getcaptureimg.ini:抓屏工具的配置文件
ImageMagick-6.3.2-Q16:图片的比对命令行工具
从主程序开讲:
主程序有四个主要的函数:
函数一:
功能:抓屏,保存指定窗体的指定区域为图片
FuncfSaveCapImg($title,$x1,$y1,$x2,$y2,$strFile)
详解:
$title:指定窗体的标题,用record录制一下对该窗体的操作,就能看到窗体的准确名称;
$x1,$y1,$x2,$y2:指定窗体的某个区域,打开record,然后点击一下窗体要拷屏区域的左上角($x1,$y1),再点击右下角($x2,$y2),停止录制后,打开看看具体的坐标,然后填入ini文件中;
$strFile:将拷屏的区域保存为图片文件名
函数二:
功能:进行图片比较,判断两张图片是否相同
Func fCmpImg( $strExe, $strImg1 , $strImg2,$strOutImg)
详解:
$strExe:图片比较的命令行工具,这里是用的ImageMagick-6.3.2-Q16的compare.exe;
$strImg1:比对的文件一;
$strImg2:比对的文件二;
$strOutImg:比对结果图片文件,这个随便写一个图片文件名称就行了。
这个工具的使用细节参考:
http://blog.csdn.net/testingba/article/details/8011815
函数三:
功能:判断当前的qq远程控制连接状态
Func fQQcnt()
详解:
其实这个是执行的dos命令,看看qq进程网络状态:
netstat -ano -P tcp|find /i "qq进程id"|find /i"ESTABLISHED"|find /V ":80 "
进程id是根据ProcessExists("qq.exe")得到的,这里有一个问题,如果有多个qq登录了,它这里只是得到了第一个登录qq的进程id,所以在使用上,必须保证被控qq是第一个登录的。
函数四:
功能:得到str2在str1中出现的次数
Func fCntStr( $str1 , $str2 )
详解:这个主要是读取窗体中的命令的
主程序配置文件qqctl.ini的说明:
[section1]
title1="wintitle" ;#受控窗体标题
x1=315
y1=65 ;#远程协助的位置x1,y1(相对窗体的坐标,不是绝对坐标)
x2=352
y2=107 ;#远程协助在二级菜单下时,二级菜单的位置x2,y2
x3=484
y3=426 ;#确定按钮的位置x3,y3(qq2011)
x4=480
y4=420 ;#申请受控按钮的位置x4,y4
[section2]
x1=417
y1=391 ;#需要保存区域的左上角
x2=537
y2=469 ;#需要保存区域的右下角
imgFile="C:\b2.jpg" ;#保存下来的图片名称
[section3]
stdimgFile="C:\b1.jpg"
;#预先使用工具Getcaptureimg.au3保存的已经受控后窗体指定区域的图片,可以想见,section2中的x1,y1,x2,y2必定和Getcaptureimg.ini中的一致
outimgFile="C:\o1.jpg" ;#结果输出图片文件名,可以随便起
exeFile="C:\ImageMagick-6.3.2-Q16\compare.exe" ;#进行图片比对的工具名称
工具getcaptureimg的配置文件说明:
[section1]
title1="wintitle"
;#被抓屏的窗体名称,对应于主程序配置文件中的section1.title
x1=417
y1=391 ;#需要保存区域的左上角
x2=537
y2=469
;#需要保存区域的右下角,对应于主程序配置文件中的section2.x1,y1,x2,y2
imgFile="C:\b1.jpg"
;#保存下来的图片名称,对应于主程序配置文件中的section3. stdimgFile
在开始运行主程序之前,需要先抓一副受控窗体的已经受控时的显示区域的图片
001.jpg
主程序详解:
读出qqctl.ini中的配置;
WHILE TRUE
IFQQ没连接 THEN
监控受控qq窗体
分析得到各个命令的个数
ELSE ;QQ连接上了
IF还没有受控 THEN
保存当前窗口指定区域为图片文件
ENDIF
IF比对图片发现窗口已经受控THEN
提示用户可以操作了
ELSE ;虽然qq连接上了,但是比对图片发现窗口还没有受控
继续监控受控qq窗体
分析得到各个命令的个数,这里其实就是在等<申请受控>命令
ENDIF
ENDIF
IF<远程协助>子串的个数比上次多 THEN
点击远程协助
ENDIF
IF<确定>子串的个数比上次多 THEN
点击确定
ENDIF
IF<申请受控>子串的个数比上次多 THEN
点击申请受控
ENDIF
WEND
如果要运行代码,需要安装autoi,autoit可以将代码编译为exe,在wins机器上拷贝使用。
Autoit3安装程序:
http://download.csdn.net/detail/testingba/4583878
录制autoit键盘鼠标操作脚本工具:
http://download.csdn.net/detail/testingba/4583600
图片比对工具< ImageMagick-6.3.2-Q16安装目录>
http://download.csdn.net/detail/testingba/4591614
使用细节参考:
http://blog.csdn.net/testingba/article/details/8011815
源码链接:
http://download.csdn.net/detail/testingba/4598550
包括:
Qqctl.au3:主程序
Qqctl.ini:主程序配套的配置文件
Getcaptureimg.au3:抓屏工具
Getcaptureimg.ini:抓屏工具的配置文件
好了,收摊!