QQ找茬辅助工具的制作

转载请注明出处:http://www.cppblog.com/greatws/archive/2009/05/05/81996.html

这段时间GF一直在玩QQ找茬,看了一下,原理很简单,就是找到2附图片的不同之处,那么程序的思路也就很明了了,就是抓图,存入buffer,比较,显示,这么一个过程。闲话不多说了,下面我用MFC来实现它。

首先先要拿到QQ找茬从窗口的句柄,拿到句柄想咋搞就咋搞,哈哈。当然也可以不要句柄,直接屏幕截图,不过那样就要保证窗口在某个特定的位置,不如句柄来的方便。嗯,还是拿句柄吧,就FindWindow这个函数吧,至于窗口名和类名,用spy++就好啦。

得到句柄之后,接下来要做的是获得窗口大小及设备DC,然后利用CreateCompatibleBitmap函数,创建与QQ找茬窗口DC兼容的BITMAP对象,针对左右2副图,创建2个,便于以后的比较,然后根据坐标偏移,这个用photoshop可以数出来,利用BitBlt函数复制QQ找茬窗口DC里的位图数据进入创建好的BITMAP对象,然后再把BITMAP中的位图数据复制到内存Buffer中,CopyBMPToBuffer是我对GetDIBits函数做了一下简单的封装,少了几个参数而已。代码如下:

BOOL CFindDlg::CopyWindowBlt(CWnd *pWndSrc)
{
    if(pWndSrc == NULL)    
    {
        return FALSE;
    }

    CRect cRect, cRectClient;
    pWndSrc->GetWindowRect(&cRect);
    pWndSrc->GetClientRect(&cRectClient);
    pWndSrc->ClientToScreen(&cRectClient);

    CDC *pSrcDC = NULL;  
    CDC cNewDC;
    CBitmap cBitmapLeft, cBitmapRight;
    BITMAPINFO bi;

    pSrcDC = pWndSrc->GetDC();
    //create Compatible Bitmap with the game window
    cBitmapLeft.CreateCompatibleBitmap(pSrcDC, m_nPicWidth, m_nPicHeight);
    cBitmapRight.CreateCompatibleBitmap(pSrcDC, m_nPicWidth, m_nPicHeight);
    cNewDC.CreateCompatibleDC(pSrcDC);
    CBitmap* pcOldBitmap = cNewDC.SelectObject(&cBitmapLeft);
    //copy bitmap to dc
    cNewDC.BitBlt(0, 0, m_nPicWidth, m_nPicHeight, pSrcDC, 
        m_nLeftPicLeftTopX - (cRectClient.left - cRect.left), 
        m_nLeftPicLeftTopY - (cRectClient.top - cRect.top), SRCCOPY);

    CopyBMPToBuffer(cNewDC.GetSafeHdc(), (HBITMAP)cBitmapLeft.GetSafeHandle(), m_pBufLeft, &bi);

    cNewDC.SelectObject(&cBitmapRight);
    cBitmapLeft.DeleteObject();

    cNewDC.BitBlt(0, 0, m_nPicWidth, m_nPicHeight, pSrcDC, 
        m_nRightPicLeftTopX - (cRectClient.left - cRect.left), 
        m_nRightPicLeftTopY - (cRectClient.top - cRect.top), SRCCOPY);

    CopyBMPToBuffer(cNewDC.GetSafeHdc(), (HBITMAP)cBitmapRight.GetSafeHandle(), m_pBufRight, &bi);

    cNewDC.SelectObject(pcOldBitmap);
    cBitmapRight.DeleteObject();
    cNewDC.DeleteDC();
    pWndSrc->ReleaseDC(pSrcDC);

    return TRUE;
}

完成上述工作以后,要比较的位图已经在2块buffer中了,数学建模完成了,已经转化成数学问题了,下面要做的就是比较数组中的数据和显示了。这里我没有用2维数组来做比较,简单的用一下一维就好啦。建立一块新的buffer,全部置为蓝色,这样可以设置alpha透过,以便直接在QQ找茬窗口上面直接显示差异,稍后就会看到效果。比较算法如下,很简单,找到不同处涂为黄色,临近的左右2点图为红色,iDifFlag是为了只涂边缘的点,实际用下来效果不是很好,如果有更好的算法,请告诉我,其中MAKECOLOR是类似COLORREF的一个宏#define MAKECOLOR(r, g, b) (0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff))

        for (int i = iLen - 1; i >= 0; i--)
        {
            pdwDstBuf[i] = MAKECOLOR(0, 0, 255);  //all colors fill blue, in order to set alpha blend
            if ((pdwLeft[i] != pdwRight[i] && iDifFlag == 0) ||
                (pdwLeft[i] == pdwRight[i] && iDifFlag == 1))
            {

                pdwDstBuf[i] = MAKECOLOR(255, 255, 0);
                if (iDifFlag == 0)
                {
                    //first different in one time
                    iDifFlag = 1;
                }
                else
                {    
                    iDifFlag = 0;
                }

                //nearby points
                if (i + 1 < iLen)
                {
                    pdwDstBuf[i + 1] = MAKECOLOR(255, 0, 0);
                }
                if (i - 1 >= 0)
                {
                    pdwDstBuf[i - 1] = MAKECOLOR(255, 0, 0);
                }
                if (i + 2 < iLen)
                {
                    pdwDstBuf[i + 2] = MAKECOLOR(255, 0, 0);
                }
                if (i - 2 >= 0)
                {
                    pdwDstBuf[i - 2] = MAKECOLOR(255, 0, 0);
                }
                i -= 2;
            }
        }

然后呢?最后一步了,就是将比较好的位图显示出来,我这里用到CreateBitmap和CreatePatternBrush这2个函数,然后再利用FillRect刷到窗口中,再把窗口用SetLayeredWindowAttributes设置为蓝色透过,然后移动到QQ找茬窗口上方,这样就OK了。不过CreateBitmap要把图片行序颠倒一下,我懒得转2维数组,直接用偏移搞了一下,OK哈哈。

     for (DWORD i = 0; i < PIC_HEIGHT / 2; i++)
     {
        for (DWORD j = 0; j < PIC_WIDTH; j++)
        {
             temp = *((DWORD*)pBuf + i * PIC_WIDTH + j);
             *((DWORD*)pBuf + i * PIC_WIDTH + j) = *((DWORD*)pBuf + PIC_WIDTH * (PIC_HEIGHT - 1 - i) + j);
             *((DWORD*)pBuf + PIC_WIDTH * (PIC_HEIGHT - 1 - i) + j) = temp;
        }
     }


    cBM.CreateBitmap(PIC_WIDTH, PIC_HEIGHT, 1, 32, pBuf);
    m_cBr.CreatePatternBrush(&cBM);
    cBM.DeleteObject();

最后用SetWindowPos将显示差异的窗口置为顶层窗口。效果图如下:

目前已知的问题:区域标示很奇怪,是算法的问题,上面我也说过了,有个flag,因为不能保证2附图片的点与点完全不同,所以这样的效果也是显而易见的。
下载: 可执行程序 (适用于2种找茬游戏,其实就是窗口大小不同)

By greatws

posted on 2009-05-06 00:13 greatws 阅读(3803) 评论(15)  编辑 收藏 引用

QQ找茬辅助工具的制作相关推荐

  1. QQ找茬辅助工具的制作[转]

    出处:http://www.cppblog.com/greatws/archive/2009/05/05/81996.html 这段时间GF一直在玩QQ找茬,看了一下,原理很简单,就是找到2附图片的不 ...

  2. QQ找茬辅助工具 C#

    昨天晚上用C#做了一个QQ游戏"找茬"辅助工具.这个不能算是一个外挂工具,因为不涉及到服务器和客户端的问题,只涉及到图像处理的知识.目前只是实现了基本的功能,但是已经够用了,玩了几 ...

  3. 跟我学 编写QQ找茬辅助1 -原创文章

    今天把完美日志更新一下打算早点睡觉的.        被朋友拉着玩了一下QQ找茬..高手大有人在啊..很是悲惨..           朋友痛恨的说.不行,要找外挂玩玩..百度一下,也还有不少..对于 ...

  4. 大家来找茬辅助工具实现

    昨天看到同学在玩大家来找茬,一时兴起,打算自己写个辅助工具.其实游戏很简单,就是找出两幅图片中的不同之处.游戏规则了解了,那外挂的思路也就很明朗了只要对比两幅图片的像素,有不相同就存储进数组就可以了. ...

  5. “图片差异检查”辅助工具(即“大家来找茬”辅助工具)源码分享

    忽然心血来潮,想写一个辅助工具,让朋友们在"大家来找茬"之类的游戏中可以少费一些眼睛. 在Java方面我是新手,在折腾了一段时间后,终于还是写出了一个基本可用的测试版程序.详细的使 ...

  6. 大家来找茬辅助工具超级简易版

    如上图所示,打开QQ游戏,等待游戏开始,按alt+print对当前窗口截屏,然后按start对图像分析,并按图中白色区域较多的提示点点击. 纯粹山寨,仅供娱乐哈.

  7. QQ找茬辅助源码下载

    http://www.cnblogs.com/kovin/p/3531761.html

  8. C#写的QQ找茬外挂

    这个暑假转眼就要过完了.本来打算在学校干两件事:学车和竞赛,结果竞赛没能杀进全国总决赛,想想也是意料中的事.学车就更郁闷了,从上学期开学报名到科目一考试,足足等了近五个月.终于摸到真车了,结果每天冒着 ...

  9. C#编写QQ找茬外挂

    QQ找茬外挂,用C#代码编写. 使用方法 这个工具的主要运行流程很简单: 游戏截图->比较图片->标记图片不同点. 实现代码 截图的处理类ScreenCapture: /// /// 提供 ...

最新文章

  1. make[1]: g++: Command not found
  2. en45545防火标准_EN45545-2材料及元件的防火要求
  3. ZooKeeper增加Observer部署模式提高性能(转)
  4. 中学计算机老师 当领导可能性,求分享,当中学计算机老师带信息学奥赛是怎样的感受 - 信息科学技术学院(EECS)版 - 北大未名BBS...
  5. python爬虫案例-python爬虫案例
  6. 第四章,简答题4-5,2017-4-6
  7. html中如何实现放大动画,CSS3实现点击放大的动画实例
  8. 【独家】衣服上的铁锈去除简易方法
  9. JavaScript闭包学习笔记
  10. Android开发实战二之Hello Android实例
  11. 一文带你熟知ForkJoin
  12. SpringBoot集成MyBatis详解
  13. java开发简历专业技能怎么写,附赠复习资料
  14. Heartbeat安装部署
  15. 教师综合素质5--地理名胜
  16. stata两种方法查看命令源代码
  17. Java文件传输带宽控制_如何限制Java中的带宽?
  18. 《富爸爸穷爸爸》阅读笔记
  19. datagrid设置单元格边框_如何设置datagridview某一个单元格的边框样式
  20. C++ Essential Training C ++基础培训 Lynda课程中文字幕

热门文章

  1. 数据预处理及相应的Rapidminer操作
  2. plsql登录时没有可选数据库和链接问题
  3. html ajax 图片上传,Ajax实现图片上传并预览功能
  4. 火狐控制台的html,Firefox outerHTML实现代码
  5. 常用算法的计算复杂度
  6. 网络安全卷么? 你身边的网络安全人过的怎么样呢?
  7. 数据库获取时间戳方式
  8. 写作系列之: UAV领域概述的参考文献集合
  9. 网络测试工具集 - netwox (可实现网络欺骗)
  10. 详解富集分析超几何分布检验