Answer the question
In order to leave comments, you need to log in
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
// класс, который эмулирует нажатие клавиш в любое активное окно
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 questionAsk a Question
731 491 924 answers to any question