前一段看Linux内核,看的头晕眼花,不得不承认,自己还没到那个层次,到了保护模式编程,我就吃不消了,什么CPL,RPL,DPL,中断门,任务门,,原来我当初学的8086的实模式编程是那么的美好,没有分段,没有分页,没有GDT,没有LDT。
于是中断了Linux的源码阅读,这时,一个学弟向我展示了他找茬的外挂,勾起了我做连连看外挂的想法,,这个想法很早以前就有了,也许是当时水平不够,加上自己也懒,一直没有动手实施。趁着这几天3把火的热情,赶紧把它给搞定了。
从原理上讲,做连连看的外挂没有什么难点,数学模型用二维数组就可以表示,也不需要什么高深的算法,简单的没有任何优化的BFS就绝对绰绰有余了。具体的思路是:
1. 将连连看界面的所有图片截下来。
2. 比较每幅图片,将一样的图片用同一整型值来表示。这样,数学模型就建立完成了。
3.
对于每幅图片(此时的图片已是数字),用BFS搜索。找到一样的可达图片后,控制鼠标进行消除。
4. 直至所有图片全部消掉。
思路很简单,到具体而微的编程的时候,因为涉及到用windows API ,而自己对这又不太熟,再加上windows
api又是出了名的复杂。所以还是困扰的地方。
OK,一步一步来,
1
要截图,就必须有游戏窗口的句柄,很简单,用FindWindow就可以搞定。
2 句柄获得了,就可以得到窗口的DC(Device
Context),然后用这个DC创建个兼容的内存DC,再创建兼容位图,加到内存DC里,然后用BitBlt将窗口DC的内容位拷贝到内存DC中的位图里就可以了。具体拷贝的时候要有每幅图片的长宽和左上角的逻辑坐标,这些我只用了windows附件中的画图工具就量出来了。其实,只要量出
图片的长宽,和每幅图片的间隔,再加上一个第一副图片左上角的坐标,其它所有的图片都可以推算出来。
3
OK,位图有了,就可以通过GetDIBBits这个API来获得位图颜色信息。不过这个API的使用也是困扰我最久的了,为了学习它,我把位图格式研究了个遍。一开始,我被两个概念搞得云里雾里,就是与设备无关的位图DIB
和
与设备有关的位图。什么嘛,位图不就位图,还有什么这么多乱七八糟的,后来通过做了一些实验,才发现原来用CBitmap表示的位图,在屏幕显示色深不同的时候,通过GetBitmapBits获得的位图颜色数组是不一样的,这种格式的位图表示依赖于显示设备。这样的话,对于我们程序员来说,简直是噩梦。还好有与设备无关的位图格式来拯救我们,通过指定个BITMAPINFO
(里面可以指定位图的色深等),我们可以用GetDIBBits来获得CBitmap表示的位图的DIB的颜色数组。这样,不论你屏幕是多少色深的,都与我程序无关。
4
有个GetDibBits,我们就可以得到每张图片的颜色数组,然后通过循环数组比较颜色值,就可以判断两张图片是否一致了。将所有一致的图片用一个整型值表示,存在二维数组中,数学模型的建立就完成了。
下面是这部分内容的源代码,数据的获取和模型的建立我封装在了一个类里