Я пытаюсь смоделировать команды клавиатуры для пользовательского приложения игрового контроллера.Потому что мне нужно моделировать команды в среде DirectInput, большинство обычных методов не работают.Я знаю, что использование ловушки будет работать на 100%, но я пытаюсь найти более простую реализацию.
Я провел немало поиска и обнаружил, что с помощью API SendInput со скан-кодами вместо виртуальных ключейдолжен работать, но, похоже, ведет себя так, как будто клавиши "залипают".Я отправил события KEYDOWN и KEYUP, но когда я пытаюсь отправить сообщение в среде DirectInput, игра действует так, как будто удерживается клавиша.
Например, если я имитирую "W"«нажмите клавишу и сопоставьте эту клавишу в шутере от первого лица с действием« двигаться вперед », как только я в игре, приведенная ниже функция заставит персонажа двигаться вперед.Однако, просто выполнив команду один раз, она переместит символ вперед на неопределенное время.
Вот фрагмент кода (на C #) для функции 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());
}
}
Я не уверен, что этот метод - безнадежное дело, или я просто скучаю по глупости.Я ненавижу чрезмерно усложнять мой код, если мне не нужно использовать хуки, но это также новая для меня территория.
Любая помощь, которую кто-либо может оказать, очень ценится.
Спасибо!