Problème de touches avec SendInput (reste enfoncée)

Résolu
rerremi Messages postés 12 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 20 septembre 2011 - 20 sept. 2011 à 21:31
BunoCS Messages postés 15479 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 juin 2024 - 21 sept. 2011 à 10:45
Bonjour,

Je suis en train de développé un petit programme qui me permet de simuler des touches dans des jeux en DirectX. La fonction sendkey ne fonctionne pas , j'utilise donc le SendInput mais le problème lorsque j’exécute mon code est que la touche est sans arrêt appuyée (exemple : mon personnage va continuellement tout droit alors que je voulais qu'il ne fasse qu'un seul pas en avant).

Voici mon code :
using System;
using System.Runtime.InteropServices;
using Microsoft.DirectX.DirectInput;

namespace monProjet
{
    public static class PressEnter
    {
        [DllImport("user32.dll")]
        public static extern int MapVirtualKey(uint uCode, uint uMapType);

        [StructLayout(LayoutKind.Sequential)]
        private struct INPUT
        {
            public UInt32 type;
            public ushort wVk;
            public ushort wScan;
            public UInt32 dwFlags;
            public UInt32 time;
            public UIntPtr dwExtraInfo;
            public UInt32 uMsg;
            public ushort wParamL;
            public ushort wParamH;
        }

        private enum SendInputFlags
        {
            KEYEVENTF_EXTENDEDKEY = 0x0001,
            KEYEVENTF_KEYUP = 0x0002,
            KEYEVENTF_UNICODE = 0x0004,
            KEYEVENTF_SCANCODE = 0x0008,
        }

        [DllImport("user32.dll")]
        private static extern UInt32 SendInput(UInt32 nInputs,
                                               [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs,
                                               Int32 cbSize);

        public static void Activate()
        {
            INPUT[] InputData = new INPUT[1];

            InputData[0].type = 1;
            InputData[0].wScan = (ushort)Key.A;
            InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
            InputData[0].time = 0;
            InputData[0].dwExtraInfo = UIntPtr.Zero;

            // send keydown
            if (SendInput(1, InputData, Marshal.SizeOf(InputData[0])) == 0)
            {
                System.Windows.Forms.MessageBox.Show("Erreur lors de l'envoie de la touche - Raison : " +
                                                   Marshal.GetLastWin32Error().ToString());
            }
        }
    }
}


Alors quand j'essaye d'utiliser KEYEVENTF_KEYUP comme flag en remplaçant le flag existant par :
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_KEYUP | (uint)SendInputFlags.KEYEVENTF_SCANCODE;


La touche n'est plus exécutée.

Et si je l'ajoute à part dans un nouveau InputData, la touche reste toujours enfoncée, impossible de l'arrêter.

Pour arrêter la touche je dois appuyer avec mon clavier physique sur la touche en question pour arrêter son exécution ...

Merci d'avance pour toutes réponses me permettant d'avancer dans ce problème.

Je tiens à signaler que sur le bloc-note de Windows, la touche ne reste pas enfoncée, c'est seulement dans les jeux directX.

Cordialement, Rémi A.

2 réponses

rerremi Messages postés 12 Date d'inscription samedi 17 décembre 2005 Statut Membre Dernière intervention 20 septembre 2011
20 sept. 2011 à 23:56
Très heureux d'avoir trouvé ma réponse grâce à cette source :
http://www.gamedev.net/topic/419710-simulate-keypress-and-directx/

J'aimerais bien supprimer ce sujet qui n'ai que du flood au final vu qu'aucun n'échange ne s'est fait, mais je ne sais pas comment supprimer un sujet posté sur code-source ?
3
BunoCS Messages postés 15479 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 juin 2024 103
21 sept. 2011 à 10:45
Hello,
J'aimerais bien supprimer ce sujet [...]

Au contraire! Une demande avec sa solution, on ne va pas supprimer ça

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous