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

Signaler
Messages postés
12
Date d'inscription
samedi 17 décembre 2005
Statut
Membre
Dernière intervention
20 septembre 2011
-
BunoCS
Messages postés
14850
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 avril 2020
-
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.
A voir également:

2 réponses

Messages postés
12
Date d'inscription
samedi 17 décembre 2005
Statut
Membre
Dernière intervention
20 septembre 2011

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 ?
Messages postés
14850
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 avril 2020
91
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...