Send mouse & keyboard events

30,996

There is an open source project on CodePlex (Microsoft's open source website)

Windows Input Simulator (C# SendInput Wrapper - Simulate Keyboard and Mouse)

http://inputsimulator.codeplex.com/

It has examples and real simple to use.

Share:
30,996
Manu
Author by

Manu

Nothing important.

Updated on June 20, 2020

Comments

  • Manu
    Manu about 4 years

    I'm developing an app that have to send some keys or mouse events to the active window.

    I'm using this class: Mouse

    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace Mouse
    {
        public static class VirtualMouse
        {
            // import the necessary API function so .NET can
            // marshall parameters appropriately
            [DllImport("user32.dll")]
            static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
    
            // constants for the mouse_input() API function
            private const int MOUSEEVENTF_MOVE = 0x0001;
            private const int MOUSEEVENTF_LEFTDOWN = 0x0002;
            private const int MOUSEEVENTF_LEFTUP = 0x0004;
            private const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
            private const int MOUSEEVENTF_RIGHTUP = 0x0010;
            private const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
            private const int MOUSEEVENTF_MIDDLEUP = 0x0040;
            private const int MOUSEEVENTF_ABSOLUTE = 0x8000;    
    
            // simulates movement of the mouse.  parameters specify changes
            // in relative position.  positive values indicate movement
            // right or down
            public static void Move(int xDelta, int yDelta)
            {
                mouse_event(MOUSEEVENTF_MOVE, xDelta, yDelta, 0, 0);
            }
    
            // simulates movement of the mouse.  parameters specify an
            // absolute location, with the top left corner being the
            // origin
            public static void MoveTo(int x, int y)
            {
                mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0);
            }
    
            // simulates a click-and-release action of the left mouse
            // button at its current position
            public static void LeftClick()
            {
                mouse_event(MOUSEEVENTF_LEFTDOWN, Control.MousePosition.X, Control.MousePosition.Y, 0, 0);
                mouse_event(MOUSEEVENTF_LEFTUP, Control.MousePosition.X, Control.MousePosition.Y, 0, 0);
            }    
            public static void RightClick()
            {
                mouse_event(MOUSEEVENTF_RIGHTDOWN, Control.MousePosition.X, Control.MousePosition.Y, 0, 0);
                mouse_event(MOUSEEVENTF_RIGHTUP, Control.MousePosition.X, Control.MousePosition.Y, 0, 0);
            }
        }
    }
    

    Keyboard

    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace Mouse
    {
        public static class VirtualKeyboard
        {
            [DllImport("user32.dll")] static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);    
            public static void KeyDown(System.Windows.Forms.Keys key)
            {
                keybd_event((byte)key, 0, 0, 0);
            }
    
            public static void KeyUp(System.Windows.Forms.Keys key)
            {
                keybd_event((byte)key, 0, 0x7F, 0);
            }
        }
    }
    

    this is my testing code:

     private void button1_Click(object sender, EventArgs e)
     {
        Thread.Sleep(2000);            
        VirtualMouse.Move(100, 100);
        VirtualMouse.RightClick();
        VirtualKeyboard.KeyDown(System.Windows.Forms.Keys.A);
        VirtualKeyboard.KeyUp(System.Windows.Forms.Keys.A);
     }
    

    Mouse moves, but doesn't send click. Any idea? How can I make a key continue pressed for some time? I tried using thread.sleep between KeyDown and KeyUp and it's not working.