外挂开发 读取游戏屏幕判断游戏状态

         在非即时战斗游戏中,为了对游戏人物和场景进行判断,需要对游戏界面进行对比,通过对比结果做出相应的操作。很多人好奇说为什么不用大漠插件和天使插件来进行处理,这样来的更便捷更强大,代码永远都是自己写的比较灵活,因为插件容易被反外挂程序检测到,所以自己掌握代码是最灵活的做法。以下代码是初级代码,自己优化封装可以通过内存读取RGB对比,快速实现识图,速度非常的话,比传统的GetPixel快了N倍。

1.画面读取:

	byte BitMap[4];
	CDC *pDC;//屏幕DC
	pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC
	int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
	int Width = pDC->GetDeviceCaps(HORZRES);//获取屏幕宽度
	int Height = pDC->GetDeviceCaps(VERTRES);//获取屏幕高度
	CDC memDC;//内存DC
	memDC.CreateCompatibleDC(pDC);
	CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
	//创建BitMap的X.Y
	memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
	oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
	//设置开始截图图片的区域
	//参数1.2:开始截取的X.Y
	//参数2.3:最终截取的X.Y
	//参数6.7:从X.Y开始截取
	memDC.BitBlt(0, 0, 100, 30, pDC, 0, 25, SRCCOPY);//复制屏幕图像到内存DC
	//以下代码保存memDC中的位图到文件
	BITMAP bmp;
	memBitmap.GetBitmap(&bmp);//获得位图信息
	FILE *fp = fopen(filename, "w+b");
	BITMAPINFOHEADER bih = {0};//位图信息头
	bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
	bih.biCompression = BI_RGB;
	bih.biHeight = 30;//设置图片的高度
	bih.biPlanes = 1;
	bih.biSize = sizeof(BITMAPINFOHEADER);
	bih.biSizeImage = (bmp.bmWidthBytes * bmp.bmHeight)/100;//图像数据大小
	bih.biWidth = 100;//设置图片的宽度
	BITMAPFILEHEADER bfh = {0};//位图文件头
	bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
	bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
	bfh.bfType = (WORD)0x4d42;
	fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
	fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
	byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
	GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p, 
		(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
	fwrite(p, 1, bmp.bmWidthBytes * 30, fp);//写入位图数据
	//bmp数组算法为 (Pix_Y * File_X + Pix_X)*3-1 开始取值
	//一个RGB占4个字节高位先存
	//RGB存储顺序为BGR倒序 255 B G R 
	//读取方向从左下角往右开始
	//反转像素,让像素的读取方式和画图工具一样,便于取值
	int pix,x=0,y=0;//读取像素的X和Y
	x=(x+1);
	y=(30-y);
	y=(y-1);
	pix=(x+(y*100))*4;
	//开始读取
	BitMap[0] = p[pix-2];
	BitMap[1] = p[pix-3];
	BitMap[2] = p[pix-4];
	BitMap[3] = p[pix-5];
	//HeapSize( GetProcessHeap(), 0, p))求指针数组的长度
	delete [] p;
	fclose(fp);
	memDC.SelectObject(oldmemBitmap);

2.画面对比 

有兴趣的同学,可以对代码进行封装优化,比如模糊对比和读取像素的代码的优化。

你可能感兴趣的:(外挂开发 读取游戏屏幕判断游戏状态)