J'essaie de simuler des commandes clavier pour une application de contrôleur de jeu personnalisée. Étant donné que j'ai besoin de simuler des commandes dans un environnement DirectInput, la plupart des méthodes habituelles ne fonctionnent pas. Je sais que l'utilisation d'un crochet fonctionnerait à 100% mais j'essaie de trouver une implémentation plus simple. J'ai fait pas mal de recherches et j'ai trouvé que l'utilisation de l'API SendInput avec Scancodes au lieu de touches virtuelles devrait fonctionner, mais il semble que les clés soient "collées". J'ai envoyé les deux événements KEYDOWN et KEYUP, mais lorsque je tente d'envoyer le message dans un environnement DirectInput, le jeu se comporte comme si la touche était maintenue enfoncée. Par exemple, si je simule une touche "W" et que cette touche est mappée dans un jeu de tir à la première personne à l'action "avancer", une fois que je suis en jeu, la fonction ci-dessous fera avancer le personnage . Cependant, en émettant la commande une seule fois, le personnage avancera indéfiniment.Simulation du clavier avec API SendInput dans les applications DirectInput
Voici un extrait de code (en C#) pour la fonction SendInput J'appelle:
[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 s'il y a juste quelque chose de stupide je Je suis manquant. Je déteste trop compliquer mon code si je n'ai pas à utiliser des crochets, mais c'est aussi un nouveau territoire pour moi.
Toute aide que quelqu'un peut donner est très appréciée.
Merci!
Qu'est-ce que 'INPUT []'? Était-ce censé provenir de "" user32.dll "'? –