Отправить события мыши и клавиатуры - PullRequest
8 голосов
/ 01 декабря 2011

Я занимаюсь разработкой приложения, которое должно отправлять некоторые ключи или события мыши в активное окно.

Я использую этот класс: Мышь

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);
        }
    }
}

Клавиатура

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);
        }
    }
}

это мой тестовый код:

 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);
 }

Мышь двигается, но не посылает щелчок. Любая идея? Как сделать так, чтобы клавиша продолжала нажиматься в течение некоторого времени? Я пытался использовать thread.sleep между KeyDown и KeyUp, и он не работает.

Ответы [ 2 ]

7 голосов
/ 01 декабря 2011

Существует проект с открытым исходным кодом на CodePlex (веб-сайт Microsoft с открытым исходным кодом)

Симулятор ввода Windows (C # SendInput Wrapper - Имитация клавиатуры и мыши)

http://inputsimulator.codeplex.com/

Он имеет примеры и очень прост в использовании.

0 голосов
/ 19 июня 2015

Ваши определения должны быть Uint32:

private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x02;
private const UInt32 MOUSEEVENTF_ABSOLUTE = 0x8000;
private const UInt32 MOUSEEVENTF_LEFTUP = 0x04;
private const UInt32 MOUSEEVENTF_RIGHTDOWN = 0x08;
private const UInt32 MOUSEEVENTF_RIGHTUP = 0x10;
...