Problème de touches avec SendInput (reste enfoncée) [Résolu]

Messages postés
12
Date d'inscription
samedi 17 décembre 2005
Dernière intervention
20 septembre 2011
- 20 sept. 2011 à 21:31 - Dernière réponse :
Messages postés
14231
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
19 novembre 2018
- 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.
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
12
Date d'inscription
samedi 17 décembre 2005
Dernière intervention
20 septembre 2011
- 20 sept. 2011 à 23:56
3
Merci
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 ?

Merci rerremi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de rerremi
Messages postés
14231
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
19 novembre 2018
- 21 sept. 2011 à 10:45
0
Merci
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...
Commenter la réponse de BunoCS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.