// класс, который эмулирует нажатие клавиш в любое активное окно
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]));
}
}