Simulando o teclado com a API SendInput em aplicativos DirectInput

Estou tentando simular comandos do teclado para um aplicativo de controlador de jogo personalizado. Como precisarei simular comandos em um ambiente DirectInput, a maioria dos métodos comuns não funciona. Eu sei que usar um gancho funcionaria 100%, mas estou tentando encontrar uma implementação mais fácil.

Pesquisei bastante e descobri que o uso da API SendInput com Scancodes em vez de chaves virtuais deve funcionar, mas parece se comportar como se as chaves estivessem "aderindo". Enviei os eventos KEYDOWN e KEYUP, mas quando tento enviar a mensagem em um ambiente DirectInput, o jogo age como se a tecla estivesse sendo pressionada.

Por exemplo, se eu simular um pressionamento de tecla "W" e mapear essa tecla em um jogo de tiro em primeira pessoa para a ação "avançar", quando estiver no jogo, a função abaixo fará com que o personagem avance. No entanto, apenas emitindo o comando uma vez, ele avançará o caractere indefinidamente.

Aqui está um trecho de código (em C #) para a função SendInput que estou chamando:

[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());
    }
}

Não tenho certeza se esse método é uma causa perdida ou se há apenas algo bobo que estou perdendo. Eu odeio complicar demais meu código se não for necessário usando ganchos, mas esse também é um novo território para mim.

Qualquer ajuda que alguém possa dar é muito apreciada.

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion