Имитация клавиатуры с 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());
    }
}

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

Просто я не могу:

  • HTTPS push

    • Eclipse git plugin не поддерживает его ( здесь )
    • Пользовательский интерфейс msygit потребляет всю существующую память и зависает
    • turtoisegit потребляет всю существующую память и зависает
  • SSH push

    • сгенерировал пару ключей, но оказалось, что github не поддерживает putty, только ssh
    • Я не я не хочу устанавливать cygwin

6
задан Bozho 5 September 2010 в 03:24
поделиться