Моделирование клавиатуры с помощью API SendInput в приложениях DirectInput

Я пытаюсь имитировать клавиатурные команды для пользовательского приложения игрового контроллера. Поскольку мне нужно моделировать команды в среде 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());
    }
}

Я не уверен, что этот метод безнадежное дело, или если есть что-то глупое, мне не хватает. Я ненавижу чрезмерно усложнять свой код, если мне не нужно использовать хуки, но это также новая территория для меня.

Мы очень ценим любую помощь, которую может оказать любой.

Спасибо!

16
задан Jason 5 September 2010 в 03:22
поделиться