C# SendInput 模擬鼠標操作的實現(xiàn)方法
剛剛開始學習C#,想自己做一個網頁游戲的掛。游戲里面有收錢的動作,一個建筑物一個建筑物的點,很累啊。于是想用C#模擬鼠標操作替我收錢,想著學習這個對以后的測試工作也有幫助,于是有了動力。學習過程也是曲折的,因為網上搜了半天資料很少。該游戲是Flash的,用sendmessage不行,因為取不到里面的對象。查到有些介紹Mouse_Event的文章,但是msdn上說已經過時。于是查到了SendInput函數(shù)。
廢話少說,上代碼:
首先看下 Win API 中SendInput函數(shù)描述:
UINT WINAPI SendInput(
__in UINT nInputs,
__in LPINPUT pInputs,
__in int cbSize
);
對應的C#代碼:
[DllImport("user32.dll")]
public static extern UInt32 SendInput(UInt32 nInputs,Input[] pInputs, int cbSize);
其中參數(shù)pInputs是的數(shù)組類型,數(shù)組元素INPUT結構,所以我們下面還要在C#中定義對應的INPUT結構或者對象。INPUT結構中主要是定義你需要的鼠標或者鍵盤等操作。nInputs指明pInputs數(shù)組長度。cbSize指明INPUT結構的大小。
定義INPUT結構,下面是Win API 中INPUT結構描述:
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
} ;
} INPUT, *PINPUT;
對應的C#代碼
[StructLayout(LayoutKind.Explicit)]
public struct Input
{
[FieldOffset(0)]public Int32 type;
[FieldOffset(4)]public MouseInput mi;
[FieldOffset(4)]public tagKEYBDINPUT ki;
[FieldOffset(4)]public tagHARDWAREINPUT hi;
}
上面看到,還有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)]
public struct MouseInput
{
public Int32 dx;
public Int32 dy;
public Int32 Mousedata;
public Int32 dwFlag;
public Int32 time;
public IntPtr dwExtraInfo;
}
[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;
}
我主要是模擬鼠標,所以只需定義鼠標的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)
//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 = http://chabaoo.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)。轉換函數(shù)如下:
dx = x * (65335/ScreenWidth) //x,y為像素坐標。
dy = y * (65335/ScreenHeight)//ScreenWidth和ScreenHeight,其實是當前顯示器的分辨率,獲得方法是ScreenWidth=Screen.PrimaryScreen.WorkingArea.Width;
ScreenHeight=Screen.PrimaryScreen.WorkingArea.Height;
相關文章
C#中的不可變數(shù)據類型介紹(不可變對象、不可變集合)
這篇文章主要介紹了C#中的不可變數(shù)據類型介紹(不可變對象、不可變集合),本文講解了不可變對象、自定義不可變集合、Net提供的不可變集合、不可變優(yōu)點、不可變對象缺點等內容,需要的朋友可以參考下2015-04-04C#中parallel.foreach實現(xiàn)多線程處理
Parallel.ForEach方法是C#中的一個并行循環(huán)方法,它可以并行地對一個集合進行迭代操作,本文主要介紹了C#中parallel.foreach實現(xiàn)多線程處理,具有一定的參考價值,感興趣的可以了解一下2024-02-02C#使用StopWatch獲取程序毫秒級執(zhí)行時間的方法
這篇文章主要介紹了C#使用StopWatch獲取程序毫秒級執(zhí)行時間的方法,涉及C#操作時間的相關技巧,需要的朋友可以參考下2015-04-04C#使用SQL DataReader訪問數(shù)據的優(yōu)點和實例
今天小編就為大家分享一篇關于C#使用SQL DataReader訪問數(shù)據的優(yōu)點和實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10