剛剛開始學習C#,想自己做一個網頁游戲的掛。游戲里面有收錢的動作,一個建筑物一個建筑物的點,很累啊。于是想用C#模擬鼠標操作替我收錢,想著學習這個對以后的測試工作也有幫助,于是有了動力。學習過程也是曲折的,因為網上搜了半天資料很少。該游戲是Flash的,用sendmessage不行,因為取不到里面的對象。查到有些介紹Mouse_Event的文章,但是msdn上說已經過時。于是查到了SendInput函數。
廢話少說,上代碼:
首先看下 Win API 中SendInput函數描述:
定義INPUT結構,下面是Win API 中INPUT結構描述:
public struct Input
{
[FieldOffset(0)]public Int32 type;
[FieldOffset(4)]public MouseInput mi;
[FieldOffset(4)]public tagKEYBDINPUT ki;
[FieldOffset(4)]public tagHARDWAREINPUT hi;
}
Win API中描述:
[StructLayout(LayoutKind.Sequential)]
public struct tagKEYBDINPUT
{
Int16 wVk;
Int16 wScan;
Int32 dwFlags;
Int32 time;
IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct tagHARDWAREINPUT
{
Int32 uMsg;
Int16 wParamL;
Int16 wParamH;
}
//X為Flash窗口的左上角的x軸絕對坐標值。屏幕左上角坐標是(0,0)。width是Flash窗口寬度。
{
for (j = Y; j <= Y +height; j+=150) //Y為Flash窗口的左上角的y軸絕對坐標值。height是Flash窗口高度。
{
MouseInput myMinput = new MouseInput();
myMinput.dx = i;
myMinput.dy = j;
myMinput.Mousedata = //www.5lwq4hdr.cn/cx361/archive/2011/12/11/0;
myMinput.dwFlag = MouseEvent_Absolute | MouseEvent_Move | MouseEvent_LeftDown | MouseEvent_LeftUp;
myMinput.time = 0;
Input[] myInput = new Input[1];
myInput[0] = new Input();
myInput[0].type = 0;
myInput[0].mi = myMinput;
UInt32 result = SendInput((uint)myInput.Length, myInput, Marshal.SizeOf(myInput[0].GetType()));
if (result == 0)
{
MessageBox.Show("fail");
}
}
}
API中MouseInput結構中的dx,dy含義是絕對坐標,是相對屏幕的而言的,屏幕左上角的坐標為(0,0),右下角的坐標為(65535,65535)。而我們在C#中獲得的對象(Frame,button,flash等)的坐標都是像素坐標,是跟你當前屏幕的分辨率相關的。假如你的顯示器分辨率是1024*768,那么屏幕左上角的像素坐標是(0,0),右下角坐標為(1024,768)。轉換函數如下:
ScreenHeight=Screen.PrimaryScreen.WorkingArea.Height;
|
新聞熱點
疑難解答