Задать вопрос
LoneRay
@LoneRay
Начинающий кодировщик.

Как имитировать нажатие клавиши клавиатуры?

Помогите пожалуйста с вопросом. Много сайтов смотрел много информации читал, но так и не нашёл толком примера из DirectInput с имитацией нажатии клавиши клавиатуры для игрового окна. Помогите пожалуйста.
Вот код того, что у меня получается, но всё равно не работает.
class DirectKeyPress
    {
        [DllImport("user32.dll")]
        static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);

        struct INPUT
        {
            public UInt32 Type;
            public ushort Scan;
            public uint Flags;
            public byte Time;
            public IntPtr ExtraInfo;
        }

        const uint KeyDown = 0x0000; //событие Down
        const uint KeyUp = 0x0002; //событие Up
        const int VK_ENTER = 0x0D;

        public void Main()
        {
            INPUT[] InputData = new INPUT[1];
            
            InputData[0].Type = 1; // тип устройства
            InputData[0].Scan = VK_ENTER; // код клавиши
            InputData[0].Flags = KeyDown | KeyUp; // событие
            InputData[0].Time = 0; //время задержки
            InputData[0].ExtraInfo = IntPtr.Zero;
            //SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)));
            // send keydown
            if (SendInput(1, InputData, Marshal.SizeOf(InputData[0])) == 0)
            {
                MessageBox.Show("Код ошибки: " +
                Marshal.GetLastWin32Error().ToString());
            }
        }
    }
  • Вопрос задан
  • 2983 просмотра
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
LoneRay
@LoneRay Автор вопроса
Начинающий кодировщик.
// класс, который эмулирует нажатие клавиш в любое активное окно
    class DirectKeyPress
    {
        [DllImport("User32.dll")] // подключение системной библиотеки
        public static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] input, int structSize); // функция, которая отправляет запрос на идентификацию и активацию действии клавиши
        [DllImport("user32.dll")] // подключение системной библиотеки
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // функция для определении окна
        [DllImport("User32.dll")] // подключение системной библиотеки
        public static extern int SetForegroundWindow(IntPtr hWnd); // функция установки фокуса для окна
        [DllImport("User32.dll")] // подключение системной библиотеки
        public static extern int ShowWindow(IntPtr hWnd, int cmdShow); // функция активации окна

        [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
        public struct MOUSEINPUT // структура для эмуляции мыши
        {
            int dx;
            int dy;
            uint mouseData;
            uint dwFlags;
            uint time;
            IntPtr dwExtraInfo;
        };

        [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
        public struct KEYBDINPUT // структура для эмуляции клавиатуры
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        };

        [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
        public struct HARDWAREINPUT // структура для эмуляции подключённого внешнего устройства
        {
            uint uMsg;
            ushort wParamL;
            ushort wParamH;
        };

        [StructLayout(LayoutKind.Explicit)] //Для указания размера каждого поля
        public struct INPUT // структура для выбора типа устройства
        {
            [FieldOffset(0)] // задаем 0 байт для переменной type
            public int type;
            [FieldOffset(4)] // задаем 4 байта для структуры MOUSEINPUT
            public MOUSEINPUT mouse;
            [FieldOffset(4)] // задаем 4 байта для структуры KEYBDINPUT
            public KEYBDINPUT keyboard;
            [FieldOffset(4)] // задаем 4 байта для структуры HARDWAREINPUT
            public HARDWAREINPUT hardware;
        };
        const uint KEYEVENTF_KEYUP = 0x0002; // событие Up
        const uint KEYEVENTF_SCANCODE = 0x0008; // событие Down + установка типа выбора определения клавиши

        public void Main()
        {
            INPUT[] inputs = new INPUT[1];

            inputs[0].type = 1; // выбрана клавиатура
            inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE; // Down
            inputs[0].keyboard.wScan = 42; // скэн код клавиши
            SendInput(1, inputs, Marshal.SizeOf(inputs[0])); // эмулируем нажатие

            inputs[0].type = 1;
            inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE;
            inputs[0].keyboard.wScan = 30;
            SendInput(1, inputs, Marshal.SizeOf(inputs[0]));

            inputs[0].type = 1;
            inputs[0].keyboard.wScan = 30;
            inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; // Up 
            SendInput(1, inputs, Marshal.SizeOf(inputs[0]));


            inputs[0].type = 1;
            inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
            inputs[0].keyboard.wScan = 42;
            SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
        }
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы