眼馋别人的程序,自己试着做一个。请教了前辈了解了一些情况。
最初思想:
1、获取找茬窗口的坐标。
2、用photoshop获取左右两张图片在游戏窗口中的坐标。
3、获取左、右两张图片,保存为BMP格式。
4、两张图片进行像素对比,相同的填充为白色,不同的填充为黑色。生成带有黑斑的图片。
5、生成图片放入找茬游戏窗口对应位置,鼠标点击黑斑直接得分。
由于按像素校验图片这块没能实现而放弃该方案。
最终实现:
1、获取找茬窗口坐标。
2、用photoshop获取左右两张图片在游戏窗口中的坐标。
3、在辅助程序窗口中快速在同一位置闪动轮换显示两张图片,找到不同。
修改:
最初希望通过进程名查找窗口句柄来自动识别找茬窗口,但是也没能办到,需要自己填写找茬窗口的句柄名称。
在实际玩过两盘找茬游戏以后发现找茬窗口有两个版本,具体叫什么我也不知道,一个大窗口版本一个小窗口版本。经过修改实现辅助大窗口找茬或者小窗口找茬的切换。
总结:
这个程序用VS2010平台C#语言编写,运行需要net framework 4.0。
学到了C#获取当前活动窗口句柄,获取窗口坐标,获取屏幕截图,获取当前图像的像素。
记录一下代码
获取窗口句柄:
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow();
获取窗口坐标(取自百度空间):
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; //最左坐标 public int Top; //最上坐标 public int Right; //最右坐标 public int Bottom; //最下坐标 }
通过坐标获取屏幕图像(取自UIPower论坛):
/// 根据坐标点获取屏幕图像 /// /// 左上角横坐标 /// 左上角纵坐标 /// 右下角横坐标 /// 右下角纵坐标 /// public static Bitmap GetScreen(int x1, int y1, int x2, int y2) { int w = (x2 - x1); int h = (y2 - y1); Bitmap myImage = new Bitmap(w, h); Graphics g = Graphics.FromImage(myImage); g.CopyFromScreen(new Point(x1, y1), new Point(0, 0), new Size(w, h)); IntPtr dc1 = g.GetHdc(); g.ReleaseHdc(dc1); return myImage; }
获取和设置图像的像素:
Bitmap a; a.GetPixel(image_x,image_y);//获取像素,image_x,image_y对应X和Y坐标 a.SetPixel(image_x,image_y,Color.Black);//设置像素,image_x,image_y对应X和Y坐标,Color指定颜色,这里为黑色
运行:
手动输入句柄实在是败笔,改了一下: