在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
刚刚开始学习C#,想自己做一个网页游戏的挂。游戏里面有收钱的动作,一个建筑物一个建筑物的点,很累啊。于是想用C#模拟鼠标操作替我收钱,想着学习这个对以后的测试工作也有帮助,于是有了动力。学习过程也是曲折的,因为网上搜了半天资料很少。该游戏是Flash的,用sendmessage不行,因为取不到里面的对象。查到有些介绍Mouse_Event的文章,但是msdn上说已经过时。于是查到了SendInput函数。 首先,第一关是,不知道怎么在C#中调用Window API。还好网上找到一篇文章,帮我入了门,多谢。不知道的可以去看看,http://www.linuxdiyf.com/1/article/2006/0702/article_796.html。好文。 废话少说,上代码: 首先看下 Win API 中SendInput函数描述:
UINT WINAPI SendInput( __in UINT nInputs, __in LPINPUT pInputs, __in int cbSize ); 对应的C#代码: [DllImport("user32.dll")]
其中参数pInputs是的数组类型,数组元素INPUT结构,所以我们下面还要在C#中定义对应的INPUT结构或者对象。INPUT结构中主要是定义你需要的鼠标或者键盘等操作。nInputs指明pInputs数组长度。cbSize指明INPUT结构的大小。
定义INPUT结构,下面是Win API 中INPUT结构描述: typedef struct tagINPUT { DWORD type; union { MOUSEINPUT mi; KEYBDINPUT ki; HARDWAREINPUT hi; } ; } INPUT, *PINPUT;
对应的C#代码 [StructLayout(LayoutKind.Explicit)]
上面看到,还有MOUSEINPUT,KEYBDINPUT,HARDWAREINPUT结构需要定义。下面直接贴出代码啦。 Win API中描述: typedef struct tagMOUSEINPUT { LONG dx; LONG dy; DWORD mouseData; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } MOUSEINPUT, *PMOUSEINPUT; typedef struct tagKEYBDINPUT { WORD wVk; WORD wScan; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } KEYBDINPUT, *PKEYBDINPUT; typedef struct tagHARDWAREINPUT { DWORD uMsg; WORD wParamL; WORD wParamH; } HARDWAREINPUT, *PHARDWAREINPUT; C#中对应代码:
[StructLayout(LayoutKind.Sequential)]
我主要是模拟鼠标,所以只需定义鼠标的flag值: const int MouseEvent_Absolute = 0x8000; const int MouserEvent_Hwheel = 0x01000; const int MouseEvent_Move = 0x0001; const int MouseEvent_Move_noCoalesce = 0x2000; const int MouseEvent_LeftDown = 0x0002; const int MouseEvent_LeftUp = 0x0004; const int MouseEvent_MiddleDown = 0x0020; const int MouseEvent_MiddleUp = 0x0040; const int MouseEvent_RightDown = 0x0008; const int MouseEvent_RightUp = 0x0010; const int MouseEvent_Wheel = 0x0800; const int MousseEvent_XUp = 0x0100; const int MousseEvent_XDown = 0x0080;
c#中模拟鼠标操作的代码:
for (i = X; i <= X+width; i += 450)
知识点:将像素坐标转化为绝对坐标: API中MouseInput结构中的dx,dy含义是绝对坐标,是相对屏幕的而言的,屏幕左上角的坐标为(0,0),右下角的坐标为(65535,65535)。而我们在C#中获得的对象(Frame,button,flash等)的坐标都是像素坐标,是跟你当前屏幕的分辨率相关的。假如你的显示器分辨率是1024*768,那么屏幕左上角的像素坐标是(0,0),右下角坐标为(1024,768)。转换函数如下: dx = x * (65335/ScreenWidth) //x,y为像素坐标。
OK。这是今天的收获,很充实,通过自学,实现了鼠标的模拟动作。遗憾的是,鼠标点过去,不但收了钱,点到建筑的时候就会帮弹出一个小窗口,问是否升级,继续自动点下去,就给我升级了,升级要花钻啊。这个我不想要,今天没有想出办法,明天继续。 |
请发表评论