Simuler le clavier dans des jeux

alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011 - 13 nov. 2007 à 18:22
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011 - 23 nov. 2007 à 20:31
Je sais que beaucoup de questions sont posées à ce sujet mais j'ai justement un problème avec la merveilleuse fonction que j'ai trouvé (sa a l'air d'être le cas pour les autres aussi)!

La simulation d'appui sur les touches du clavier fonctionnent très bien mais dans les jeux de voiture que j'ai pu tester (TrackMania, FlatOut), le pilotage est impossible.

J'utilise dans cette fonction keybd_event, mais je ne pense pas que sa a un rapport avec celle-ci!

Aidez-moi s'il vous plaît, si tout ce passe bien pour mon programme, je publierai celui-ci sur ces pages

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>

16 réponses

alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
13 nov. 2007 à 21:23
Pas de réponse pour le moment, ce n'est pas grave, je suis pas préssé!

Voici un aperçu de mon programme en ce moment (pas terminé biensur) ::
http://images2.hiboox.com/images/4607/ax3fawvl.jpg

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
13 nov. 2007 à 22:34
Nouvelle image avec petite démo des accélérateurs et des diodes alumées (vous pouvez retrouver un affichage des accélérateur de la wiimote sur un script car c'est de lui que je me suis inspiré, j'y ai ajouté l'affichage des sources infrarouge)!

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 nov. 2007 à 00:43
Salut, une majorité des jeux utilisent DirectInput pour gérer le clavier.. les frappes du clavier simulées avec keybd_event ou SendInput devraient être interprétées par DirectInput.. (Je sais que ça marche quand on simule la souris avec SendInput mais je n'ai pas testé avec le clavier.)
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
14 nov. 2007 à 19:42
Merci pour l'info, j'accepte la réponse car sa me suffit!

Si cette aproche fonctionne, je le confirmerai ici

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
14 nov. 2007 à 20:39
Tout mes essais n'ont rien donnés, donc je chercherai encore un moment!

Je voudrai que mon système de simulation soit équivalent à celui de Glovepie mais je n'ai rien trouvé sur le net

Si vous avez des informations sur tout cela, je serais heureux que vous les partagiez avec moi!!

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 nov. 2007 à 09:17
Utilises tu SendInput comme dans mon exemple >ici<, c'est à dire avec un event pour la touche enfoncée et un autre event pour la touche relachée.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 nov. 2007 à 09:26
Je précise que la fenêtre du jeu doit avoir aussi le focus pour intercepter les frappes du clavier.
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
15 nov. 2007 à 18:33
Merci pour ce lien, j'ai essayé mais sa a peut être à voir avec le focus comme tu dis!
J'ai tenté d'utiliser ce qui est donné en utilisant pour récupérer le focus ceci ::
SetFocus(FindWindow(null, "TmUnited"));

Puis voici la bout de code qui fait la simulation (Par Villard Grégory) ::
c static void FrappeClavier(VirtualKeys Touche)
{
    FrappeClavier(Touche, GetForegroundWindow());
}
public static void FrappeClavier(VirtualKeys Touche, IntPtr hWnd)
{
    IntPtr ptr = GetForegroundWindow();
    if (ptr != hWnd) SetForegroundWindow(hWnd);
   
    keybd_event((byte)Touche,0,0,0);
    keybd_event((byte)Touche,0,(int)KeybordEvent.KEYEVENTF_KEYUP,0);
   
    if (ptr != hWnd) SetForegroundWindow(ptr);
}

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
18 nov. 2007 à 16:12
Pour le moment je n'arrive toujours pas à faire fonctionner ceci dans mes jeux mais toutes les tentatives fonctionnaient sur des programmes (ex: blocnote ...)!

Voici un aperçu de mon programme maintenant ::

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 nov. 2007 à 09:22
Essaye en donnant le focus à un contrôle en particulier dans ta forme. Tu peux retrouver le handle d'un contrôle d'une autre application avec FindWindowEx .
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 nov. 2007 à 09:28
Un autre exemple pour écrire dans la zone texte de Notepad.

        private const int WM_CHAR = 0x0102;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;
        private const string WINDOW_NAME = "Sans titre - Bloc-notes";


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern IntPtr FindWindow( string className, string windowName );


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern bool PostMessage( IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam );


        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern IntPtr FindWindowEx( IntPtr hWndParent, IntPtr hWndChild, string className, string WindowName );
   
        private void WriteToNotepad( string text )
        {
            // Cherche si un nouvelle fenêtre de notepad est déja ouverte.
            IntPtr hWnd = FindWindow( null, WINDOW_NAME );


            // Ouvre une nouvelle fenêtre de notepad.
            if ( hWnd == IntPtr.Zero )
            {
                Process p = Process.Start( "notepad.exe" );
                p.WaitForInputIdle( 500 );
                hWnd = p.MainWindowHandle;
                p.Close( );
                p = null;
            }


            // Obtient la fenêtre d'édition ( avec le ClassName ).
            hWnd = FindWindowEx( hWnd, IntPtr.Zero, "Edit", null );


            if ( hWnd == IntPtr.Zero )
                throw new Win32Exception( );


            foreach( char c in text )
                PostMessage( hWnd, WM_CHAR, ( UIntPtr )c, IntPtr.Zero );
        }
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
20 nov. 2007 à 23:15
Si je prend ce qui m'est utile avec ce que je sais du jeu (pas grand chose), sa donne sa ::

        private const int WM_CHAR = 0x0102;
        private const int WM_KEYDOWN = 0x0100;
        private const int WM_KEYUP = 0x0101;
        private const string WINDOW_NAME = "TmUnited";

        [ DllImport( "User32.dll", SetLastError = true ) ]
        private static extern bool PostMessage( IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam );
  
        private static void Test()
        {
            IntPtr hWnd = FindWindow(null, WINDOW_NAME);
            PostMessage(hWnd, WM_CHAR, (UIntPtr)VirtualKeys.VK_RETURN, IntPtr.Zero);
        }

VirtualKeys.VK_RETURN c'est égale à 0x0D soit 13 en int! => touche "Entrer"
j'ai essayé et sa ne fonctionne pas, j'arrive comme avec les autres méthodes à récupérer le handle,
mais sa ne fonctionne jamais, parcontre dans FlatOut toute marche,
seulement dans le menu mais comme pour TrackMania, dans le jeu il ne donne rien!

D'après ce que j'ai récupérer comme information c'est parce que les jeux utilisent DirectInput et qu'en quelque sorte ils sont connecté au périphérique directement. Donc il faudrai passer directement dans le périphérique (je dis mais je je sais pas comment faire)

C'est un peu frustrant de ne pas y arriver, certains ont dit sur internet qu'ils créé leurs propre dll DirectInput et changeait celle présente afin d'en avoir le contrôle mais je ne veux en aucun cas utiliser cette méthode.
De plus, le programme GlovePie fonctionne parfaitement et je me pose énormément de questions à ce sujet!

Si quelqu'un sait sa!! Sa me serai très très utile

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
20 nov. 2007 à 23:17
J'ai oublié de mettre l'importation de la dll pour FindWindow mais je l'ai dans mon code à l'identique (c'est pour cela que je l'ai zappé)!!

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
23 nov. 2007 à 13:22
Le plus important dans mon code précédent c'était surtout FindWindowEx qui permet de récupérer le handle d'un contrôle en particulier et non pas de la forme. En plus si c'est VK_RETURN que tu veux envoyer il faut utiliser WM_KEYDOWN et pas WM_CHAR.

Je ne connais pas ton jeu, je ne sais pas comment il est foutu, mais envoyé des touches à un contrôle en particulier ou à toute la forme, c'est différent. Donc si ton jeu contient un/des contrôle(s), même invisible :

- Soit tu donnes le focus au contrôle + SendInput ( voir page précédente ).

- Soit FindWindowEx + PostMessage ( voir plus haut ).
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
23 nov. 2007 à 17:44
Ok, si je n'ai pas utilisé "FindWindowEx", c'est parce que je ne sais pas du tout comment est fait le jeu mais je connais le titre de la fenêtre grâce à son apparition en barre des tâches!

Je vais essayer avec ce que tu me dis, et je te donne des nouvelles

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
23 nov. 2007 à 20:31
Je n'ai rien trouvé sur TrackMania et j'ai essayé déjà tout ce que j'ai pu trouver sur le net à propos de la simulation de touche!

Sa commence à me ronger ce GlovePie (il me cherche )

Pseudo :: PyroFrissons ou Mr Blagues
<hints id="hah_hints"></hints>
0
Rejoignez-nous