Я пытаюсь имитировать команды клавиатуры для пользовательского приложения игрового контроллера. Поскольку мне нужно моделировать команды в среде DirectInput, большинство обычных методов не работают. Я знаю, что использование hook будет работать на 100%, но я пытаюсь найти более легкую реализацию.
Я довольно много искал и обнаружил, что с использованием API-интерфейса SendInput со Scancodes вместо виртуальных ключей нужно работать, но, похоже, он ведет себя так же, как ключ "прилипает". Я отправил оба события KEYDOWN и KEYUP, но когда я пытаюсь отправить сообщение в среде DirectInput, игра действует так, как будто ключ удерживается.
Например, если я имитирую "W" нажатие клавиши, и этот ключ, отображаемый в шутер от первого лица, будет действовать в действие "двигаться вперед", как только я буду в игре, функция ниже заставит персонажа двигаться вперед. Однако, просто выдав команду один раз, она будет перемещать символ вперед бесконечно.
Вот фрагмент кода (в С#) для функции SendInput, которую я вызываю:
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public static void Test_KeyDown()
{
INPUT[] InputData = new INPUT[2];
Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
InputData[1].type = 1; //INPUT_KEYBOARD
InputData[1].wScan = (ushort)ScanCode;
InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);
// send keydown
if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
{
System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
Marshal.GetLastWin32Error().ToString());
}
}
Я не уверен, что этот метод является потерянной причиной, или если есть что-то глупое, я пропал без вести. Мне не нравится слишком усложнять мой код, если мне не нужно использовать крючки, но для меня это тоже новая территория.
Любая помощь, которую любой может дать, очень ценится.
Спасибо!