最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# SendInput 模擬鼠標操作的實現(xiàn)方法

 更新時間:2013年04月27日 14:48:35   作者:  
C# SendInput 模擬鼠標操作的實現(xiàn)方法,需要的朋友可以參考一下

剛剛開始學習C#,想自己做一個網(wǎng)頁游戲的掛。游戲里面有收錢的動作,一個建筑物一個建筑物的點,很累啊。于是想用C#模擬鼠標操作替我收錢,想著學習這個對以后的測試工作也有幫助,于是有了動力。學習過程也是曲折的,因為網(wǎng)上搜了半天資料很少。該游戲是Flash的,用sendmessage不行,因為取不到里面的對象。查到有些介紹Mouse_Event的文章,但是msdn上說已經(jīng)過時。于是查到了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://m.fzitv.net/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#面向對象設計原則之接口隔離原則

    C#面向對象設計原則之接口隔離原則

    這篇文章介紹了C#面向對象設計原則之接口隔離原則,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#單例模式Singleton的實現(xiàn)詳解

    C#單例模式Singleton的實現(xiàn)詳解

    單例模式(Singleton?Pattern)是日常開發(fā)中最簡單的設計模式之一,它提供了一種創(chuàng)建對象的最佳方式,本文主要為大家介紹的是C#單例模式的實現(xiàn)方法,需要的可以參考一下
    2023-05-05
  • Unity輸出帶點擊跳轉功能的Log實現(xiàn)技巧詳解

    Unity輸出帶點擊跳轉功能的Log實現(xiàn)技巧詳解

    這篇文章主要為大家介紹了Unity輸出帶點擊跳轉功能的Log實現(xiàn)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • WinForm實現(xiàn)攔截窗體上各個部位的點擊特效實例

    WinForm實現(xiàn)攔截窗體上各個部位的點擊特效實例

    這篇文章主要介紹了WinForm實現(xiàn)攔截窗體上各個部位的點擊特效實例,對窗體上各個部位進行定義,從而實現(xiàn)了點擊特效,需要的朋友可以參考下
    2014-09-09
  • UnityWebRequest前后端交互實現(xiàn)過程解析

    UnityWebRequest前后端交互實現(xiàn)過程解析

    這篇文章主要介紹了UnityWebRequest前后端交互實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • C#使用foreach語句遍歷堆棧(Stack)的方法

    C#使用foreach語句遍歷堆棧(Stack)的方法

    這篇文章主要介紹了C#使用foreach語句遍歷堆棧(Stack)的方法,涉及C#操作foreach實現(xiàn)遍歷堆棧的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • WPF實現(xiàn)好看的Loading動畫的示例代碼

    WPF實現(xiàn)好看的Loading動畫的示例代碼

    這篇文章主要介紹了如何利用WPF實現(xiàn)好看的Loading動畫效果,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,需要的可以參考一下
    2022-08-08
  • Unity游戲開發(fā)之2048游戲的實現(xiàn)

    Unity游戲開發(fā)之2048游戲的實現(xiàn)

    2048是一款數(shù)字益智游戲,初始數(shù)字則是由2+2組成的基數(shù)4。在操作方面的不同則表現(xiàn)為一步一格的移動,變成更為爽快的一次到底。相同數(shù)字的方?jīng)r在靠攏、相撞時會相加。本文將通過Unity3D實現(xiàn)這一游戲,需要的可以參考一下
    2022-03-03
  • C#實現(xiàn)撲克游戲(21點)的示例代碼

    C#實現(xiàn)撲克游戲(21點)的示例代碼

    21點又名黑杰克,該游戲由2到6個人玩,使用除大小王之外的52張牌,游戲者的目標是使手中的牌的點數(shù)之和不超過21點且盡量大。本文將用C#實現(xiàn)這一經(jīng)典游戲,需要的可以參考一下
    2022-08-08
  • 淺析WPF中Popup彈出層的使用

    淺析WPF中Popup彈出層的使用

    這篇文章將通過一個簡單的小例子,為大家詳細介紹一下如何在WPF開發(fā)中,通過Popup實現(xiàn)鼠標點擊彈出浮動??看翱?有需要的小伙伴可以了解下
    2024-01-01

最新評論

赫章县| 林甸县| 郑州市| 万载县| 丘北县| 信阳市| 磐石市| 集贤县| 伊宁市| 永顺县| 南投市| 郧西县| 精河县| 池州市| 察雅县| 旌德县| 呼玛县| 林周县| 柳河县| 新民市| 林甸县| 云霄县| 邛崃市| 周口市| 平遥县| 龙游县| 成武县| 永兴县| 江永县| 同江市| 新野县| 高唐县| 肥城市| 新安县| 吴忠市| 荣成市| 察隅县| 平果县| 万载县| 汕尾市| 大田县|