D
D
Denis Mashanov2016-11-09 16:19:56
DirectX
Denis Mashanov, 2016-11-09 16:19:56

How to simulate a keyboard key press?

Help please with a question. I looked at a lot of sites, read a lot of information, but did not really find an example from DirectInput with imitation of pressing a keyboard key for a game window. Help me please.
Here is the code of what I get, but still does not work.

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

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
Denis Mashanov, 2016-11-12
@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]));
        }
    }

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question