无聊的时候想的,思路是 QQ找茬就是两个图片中寻找不同的区域,其他都一样所以 思路就明确了直要我们把这两张图片截下来然后比较就可以了。 好思路就是这样 很简单吧,然后说一下关于 RECT的概念 这个以前一直很遗憾。后来看了windows程序设计这本是才了解的大概。
typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT; 图:
然后是截图的代码:
HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域
{ HDC hScrDC, hMemDC; // 屏幕和内存设备描述表
HBITMAP hBitmap,hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
} 这个是关键的代码,然后是怎么计算游戏图片的位置了,哈哈这个比较简单
我是先用GetWindowRect获取客户区相对有显示屏的RECT然后在加上QQ找茬中的目标图片的位置就可以了哈哈! 可一个非常关键的问题是我们怎么获得QQ找茬中的目标图片的位置呢? 其实呀很简单不过我们需要一个工具,用QQ的截屏工具就可以获得!(截图的时候看右上角就知道 width 和height了) 其他的都比较简单了我直接把代码贴出来吧:http://pan.baidu.com/s/1nt6Xy1F
本文固定链接: http://eightquit.com/VC/34.html
|