«Нужно делать так, как нужно. А как не нужно, делать не нужно!»
Контакты

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (12)

Лучшие ответы пользователя

Все ответы (27)
  • Как имитировать нажатие клавиши клавиатуры?

    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]));
            }
        }
    Ответ написан
    1 комментарий

Лучшие вопросы пользователя

Все вопросы (73)