天天看點

.net c# windows 模拟滑鼠事件(轉)

.net c# windows 模拟滑鼠事件 2010-03-27 10:11  

有時,我們需在我們的程式中模拟滑鼠的移動、點選等動作。——比如,一個再現使用者操作的宏,或者一個示範操作方法的Demo程式。那麼,我們在.Net中如何實作呢?.Net并沒有提供改變滑鼠指針位置、模拟點選操作的函數;但是Windows API提供了。其中一個是:

        [DllImport("user32.dll")]        static extern bool SetCursorPos(int X, int Y); 

該函數可以改變滑鼠指針的位置。其中X,Y是相對于螢幕左上角的絕對位置。另一個函數是:

        [DllImport("user32.dll")]        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

這個函數不僅可以設定滑鼠指針絕對的位置,而且可以以相對坐标來設定。另外,該函數還可以模拟滑鼠左右鍵點選、滑鼠滾輪操作等。其中的MouseEventFlag是一個基于uint類型的枚舉,定義如下:

        [Flags]        enum MouseEventFlag : uint        {            Move        = 0x0001,            LeftDown    = 0x0002,            LeftUp      = 0x0004,            RightDown   = 0x0008,            RightUp     = 0x0010,            MiddleDown = 0x0020,            MiddleUp    = 0x0040,            XDown       = 0x0080,            XUp         = 0x0100,            Wheel       = 0x0800,            VirtualDesk = 0x4000,            Absolute    = 0x8000        }

關于這兩個函數的詳細說明,可以檢視MSDN Library或者Windows的Platform SDK文檔。下面的示範程式(完整版源代碼,VS.Net 2005/C#)示範了使用上面的函數,控制滑鼠移動到工作列并點選“開始”按鈕的方法。(該程式使用了FindWindowEx等API函數來查找工作列及開始菜單)

原代碼:http://files.cnblogs.com/smalldust/SimulateMouse.zip

原文位址:http://www.cnblogs.com/eaglet/archive/2009/07/24/1529920.html

public partial class DemoForm : Form

    {

        [Flags]

        enum MouseEventFlag : uint

        {

            Move        = 0x0001,

            LeftDown    = 0x0002,

            LeftUp      = 0x0004,

            RightDown   = 0x0008,

            RightUp     = 0x0010,

            MiddleDown = 0x0020,

            MiddleUp    = 0x0040,

            XDown       = 0x0080,

            XUp         = 0x0100,

            Wheel       = 0x0800,

            VirtualDesk = 0x4000,

            Absolute    = 0x8000

        }

        [DllImport("user32.dll")]

        static extern bool SetCursorPos(int X, int Y);

        [DllImport("user32.dll")]

        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

        const int AnimationCount = 80;

        private Point endPosition;

        private int count;

        public DemoForm()

        {

            InitializeComponent();

        }

        private void btnStart_Click(object sender, EventArgs e)

        {

            endPosition.X = 1293;//設定目的地 X

            endPosition.Y = 884; //設定目的地 Y

            if (chkAnimation.Checked)//有過程

            {

                this.count = AnimationCount;

                movementTimer.Start();

            }

            else

            {

                //直接執行設定

                SetCursorPos(endPosition.X, endPosition.Y);

                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);

                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);

            }

        }

        private void movementTimer_Tick(object sender, EventArgs e)//即使開始運作過程

        {

            int stepx = (endPosition.X - MousePosition.X) / count;

            int stepy = (endPosition.Y - MousePosition.Y) / count;

            count--;

            if (count == 0)

            {

                movementTimer.Stop();

                //SetCursorPos(endPosition.X, endPosition.Y);//強制最終坐标

                mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);

                mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);

            }

            tbCursor.Text = String.Format("({0}, {1})", MousePosition.X, MousePosition.Y);

            mouse_event(MouseEventFlag.Move, stepx, stepy, 0, UIntPtr.Zero);

        }

    }

轉載于:https://www.cnblogs.com/boxianglei/archive/2011/11/06/2238192.html

c#