Simulation du clavier avec l'API SendInput dans les applications DirectInput

Je suis en train de simuler des commandes de clavier pour un jeu personnalisé application du contrôleur. Parce que je vais avoir besoin de simuler des commandes dans un DirectInput de l'environnement de la plupart des méthodes habituelles ne fonctionnent pas. Je sais qu'à l'aide d'un crochet serait de travailler à 100%, mais je vais essayer de trouver une mise en œuvre facilitée.

J'ai fait un peu de recherche et constaté que l'utilisation de l'API SendInput avec Scancodes au lieu de touches virtuelles devrait fonctionner, mais il semble se comporter comme les clés sont "coller". J'ai envoyé deux de la KEYDOWN et KEYUP événements, mais lorsque je tente d'envoyer le message dans un DirectInput de l'environnement, le jeu agit comme si la touche est maintenue enfoncée.

Par exemple, si je simule un "W" keypress et pour que la clé soit mappé dans un jeu de Tir Première Personne à "aller de l'avant" de l'action, une fois que je suis dans le jeu, la fonction ci-dessous sera la cause de la personnage à aller de l'avant. Cependant, tout en émettant la commande d'une fois, déplacer le personnage en avant indéfiniment.

Voici un extrait de code (en C#) pour l'SendInput fonction je suis d'appeler:

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

Je ne sais pas si cette méthode est une cause perdue, ou si il ya juste quelque chose de stupide, je suis absent. Je déteste de plus de compliquer mon code si je n'ai pas à par l'aide de crochets, mais c'est aussi un nouveau territoire pour moi.

Aucune aide n'importe qui peut donner est très apprécié.

Merci!

source d'informationauteur Jason