C# SendInput 實現類比滑鼠操作

來源:互聯網
上載者:User

 剛剛開始學習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")]         
public static extern UInt32 SendInput(UInt32 nInputs,Input[] pInputs, int cbSize);

 

其中參數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)]        

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 = 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)。轉換函式如下:

dx = x * (65335/ScreenWidth) //x,y為像素座標。
dy = y * (65335/ScreenHeight)//ScreenWidth和ScreenHeight,其實是當前顯示器的解析度,獲得方法是ScreenWidth=Screen.PrimaryScreen.WorkingArea.Width;

ScreenHeight=Screen.PrimaryScreen.WorkingArea.Height;

 

 OK。這是今天的收穫,很充實,通過自學,實現了滑鼠的類比動作。遺憾的是,滑鼠點過去,不但收了錢,點到建築的時候就會幫彈出一個小視窗,問是否升級,繼續自動點下去,就給我升級了,升級要花鑽啊。這個我不想要,今天沒有想出辦法,明天繼續。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.