QQ游戏外挂?!
说句老实话,已经有近两年没怎么上QQ了,“没怎么上”的意思是少于十次。但是最近家里来了几个朋友,在我的电脑上安装了QQ,顺带着装了一堆QQ相关的东东,像是超级旋风、QQ游戏、QQ音乐等等。
看她们玩QQ游戏里的“大家来找茬”,感觉蛮有意思的。于是大家一起上阵,开始找茬。这个游戏里面的图片都不是很清晰,而且多数都是大场景,要把所有的不同之处全找出来,还是有一定难度的。
不过,这怎么能难倒我呢,嘿嘿,写个程序搞定它。
首先是分析。两张并列的图片,大小是一样的,要快速标记出不同的地方,可以逐点取颜色,两个图片中位置相同但图片不同的地方,将点重新绘制成红色,而一样的地方,转换为同等亮度的灰度色,这样,就可以立刻得到不同的区域了,一旦不同的区域被标记出来,剩下的事情就是轻移鼠标,点击确认罢了。
OK,想到就做。打开Visual Studio,创建一个工程。我们先要取得这两张图片,这个好说,截屏而已,先截取整个屏幕当前显示内容,然后取得鼠标所在位置的窗口位置和大小,然后从整个屏幕截图中再截取这个窗口的内容,就得到QQ游戏窗口的内容了。不过我们需要的是游戏窗口中的两张并列图片,而这两张图片并不是两个窗口控件,没有办法直接定位,那就手工好了,通过上下左右键,完成第一张和第二张图片的定位,将偏移保存到一个配置文件中,这样下一次就不用再重新定位了。
现在,我得到了两张图片,该逐点取色并比较。喔,天哪,一张图片381×286,需要循环108966次,太慢了。是否有别的途径来快速定位?嗯,想到曾经见过SVN内置的一个文件比较工具,可以很容易的找出两个文本文件中不同部分,而对于图像文件,则使用了一个很有意思的方式来比较:将两个图片叠加显示,位于上面的图片透明度可以调节,这样,当使用鼠标移动透明度调节钮的时候,就能够很容易分辨出不同的位置了。我决定也这么做。
半透明图片,怎么处理?嗯,可以考虑使用CXImage类来处理。不过这么个小东西要引入CXImage,貌似有些得不偿失,用GUI+?嗯,想想有没有别的更简单的方法吧。
那么利用人眼的视觉,就应该可以搞定,就是两张图片交替显示,控制一下不要闪烁就可以了。这个办法好,实现起来非常简单,很快就搞定了,呵呵,效果还是蛮不错的。
现在,这个辅助程序是这样工作的:进入游戏界面后,利用辅助程序的定位功能,能够获取并记住游戏窗口,然后通过上下左右键来定位第一张和第二张图片,然后保存定位信息,方便下一次使用。游戏开始后,每次出现新的图片,就点击一下显示按钮,两张图片就开始交替显示,哇,不同之处立马分辨出来了。还好用的是这种方式,因为QQ的找茬游戏,每次出现的两张图片与其他关卡的图片可能是不一样大的,而且相对位置也不尽相同,这时只需要用上下左右键重新微调一下就可以了。
呵呵,利器在手,找茬去也~~~
![Apex[有所思,有所志]](http://apex.ncksoft.com/wp-content/themes/deepwater/images/dw_site_logo.png)
敬请留言: