引子
今年中秋闲在家,总要找点事做。
前几天开始学python,很早之前就有计划拿下这门语言了,可惜一直拖到现在……不可否认,我也是个拖沓症患者。在学习python的过程中,我很想了解这门语言适合做什么,能做什么,然后,从互联网海量信息中得知,python不仅适合作为程序员学习第一门语言,也是黑客喜欢的语言,python被称为各种语言的”胶水语言“。在这个过程中,无意间看到了一篇python前辈的博客——用python写QQ美女找茬游戏外挂(
点击跳转查看)。对于外挂,从没涉足,也完全不了解,但那篇博客给了我思路,引起了我的兴趣,编程这么久了,从没考虑过做外挂,不知道用java能不能实现。我试着从互联网找答案,基本都说java不适合做外挂,因为他的运行机制限制——运行在沙箱内,使其不能*访问底层API。但是我之前了解java的一个Robot类,能实现屏幕截图,模拟鼠标键盘操作。对于实现那个外挂(或者叫辅助更合适)应该问题不大,因此,用java开发美女找茬辅助的想法就这样应运而生。
体验
效果图:
可执行jar下载地址:
源代码下载:
本程序及源代码仅用于学习研究,请不要用于商业和非法目的,由此产生的法律纠纷,自行负责,作者本人一概不负任何责任!
解析
实现思路:
1.截取屏幕;
2.根据游戏窗口独特的图标,查找游戏窗口左上角坐标;
3.根据窗口的坐标计算两张对比图片的位置,然后剪切出两张图片。
4.对比两张图片,找出不同的地方。
5.创建透明背景窗口,将找到的两张图片不同的地方用点绘制在该透明背景窗口上。
开发过程中主要涉及到一下几个点,已经分篇说明:
1. 屏幕截图及图片剪切。(点击这里查看)
2. 图片上查找图片算法。(点击这里查看)
3. 比较两张同尺寸图片,找出不同的地方。
类似上面图片上查找图片的算法,其实就是读取两张图片为BufferedImage对象,取出每个像素点的GRB值进行比较,用一个同样大小的二维数组记录比较结果,相同的像素点位置记录为0,不相同的像素点位置记录为1。等到图片比较完成后,就得到一个标记两张图片异同点的二位数组。
4. 透明背景窗口的妙用。
当设置窗口背景完全透明后,偶然发现透明的的地方类似窗口的破洞。这个特性可以很好的利用起来,比如,可以实现任意形状的窗口。
在这里,利用这一特性,我在用点绘制两张图片不同的地方时,遍历比较结果的二位数组,只关注标记为1的点,并且忽略掉了上下左右都是1的点,这样绘制出来的效果就形成了中间镂空的区域,加上我让透明窗口始终保持最前,因此,虽然java的透明窗口始终覆盖在游戏界面上,但鼠标依然可以点击到游戏界面上的控件,非常神奇!
5. 设置全局(操作系统级)热键。(点击这里查看)
6. 鼠标拖拽。(点击这里查看)
7. 内存释放。
本以为不需要这一步,当我写完实际检验的时候,发现对比十几对图片后,再点击按钮,没反应了,到控制台输出一看,原来是内存溢出了。因为写的类的成员变量有几个比较大的二维数组,每次比较都是重新实例化类。因此,有必要主动请求java虚拟机尽快进行垃圾回收,即调用System.gc(),需要说明的是,就算你调用了System.gc(),也不能保证java虚拟机马上进行垃圾回收。另外,为了让java虚拟机有效地找到不用的对象,因此,需要将不用的成员变量赋予null值。为了简便,虽然我依然是每次比较都是重新实例化类,但在比较之前,我先请求进行垃圾处理,释放内存。
总结
写完之后我才发现,老早已经有java前辈写过这个辅助了。写这个小程序差不多花掉了我两天时间,最后总算写出来了,也有不少收获与体会。然后,写博客就是对着前两天编码的总结,同时,跟小伙伴们分享,共同进步。