Simuler l'appui d'une touche en C

Fermé
Arzael Messages postés 1 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 12 mars 2013 - Modifié par Arzael le 12/03/2013 à 16:45
 under 2.2 - 25 nov. 2013 à 18:04
Bonjour,
Je voulais savoir s'il était possible, et comment, de simuler l'appui d'une touche en C de manière à ce qu'un autre programme ( ou jeu, par exemple ) "croie" qu'un utilisateur à appuyé sur celle-ci.
Je fais donc appel à vous pour m'expliquer comment faire ( je débute en C ) et de préférence sous windows ^^.
Merci d'avance, Arzael

5 réponses

J'ai trouvé un site qui explique parfaitement ! http://tcharles.developpez.com/simul/
4
Salut et merci d'avoir répondu aussi vite ! Cependant, j'ai un léger problème, en effet j'ai modifié ton anti-idle pour qu'il fonctionne sur minecraft, j'obtiens donc ça :

#include <stdio.h>
#include <windows.h>

int main(void){
char *nomfenetre="Minecraft"; /* nom de la fenetre du jeu */
HWND hnd=FindWindow(NULL,nomfenetre); /* recupere son handle */
if(hnd){ /* si fenetre trouvee */
printf("ca marche");
while(1){ /* boucle infinie */
PostMessage(hnd,WM_KEYDOWN,VK_SPACE,0); /* touche enfoncée */
PostMessage(hnd,WM_KEYUP,VK_SPACE,0); /* touche relachée */
printf("\n l'appui a fonctionne");
_sleep(10000); /* attend dix secondes */
}
} else printf("err\n"); /* si fenetre non trouvee */
return 0;
}

Mon programme m'indique qu'il fonctionne mais mon personnage ne fait rien ! ( la touche espace représente le saut dans ce jeu )

De plus, que représente le 0 de " PostMessage(hnd,WM_KEYDOWN,VK_SPACE,0);" ?

Sur-ce, a+ et désolé pour toutes ces questions !

EDIT : je ne sais pas pourquoi les alignements ne sont pas pris en compte sur mon message !
2
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
19 mars 2013 à 00:18
Le zéro c'est le lparam de WM_KEYDOWN un entier de 32 bits dont les champs sont utilisés pour divers trucs : https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown?redirectedfrom=MSDN En mettant zéro ça reproduit la même que si vous restez appuyé sur la touche de vôtre clavier c'est pourquoi il y a keyup pour simuler le relâchement de la touche. Je n'ai pas minecraft ne peux pas vous aider à découvrir pourquoi ça ne fonctionne pas j'ai utilisé le même code sur d'autres jeux sans problème.
0
Re-Salut après un bon bout de temps ^^ J'ai compris pourquoi l'anti-idle ne marchait pas sur tous les jeux, il faut utiliser keybd_event() au lieu de PostMessage(), et du coup plus besoin de fenêtre cible du coup l'anti-idle est encore + simple !
2
tu pourrai mettre le code corrigés en commentaires ?

merci d'avance
0
Je te fais ça ! Par contre sache que cette fois on n'envoie pas à une fenêtre l'info mais à windows, résultat, l'anti idle ne marche que sur la fenêtre en premier plan et perd donc un peu de son utilité ^^ ( donc à n'utiliser de préférence que sur les jeux sur lesquels l'ancien ne marche pas ( rare ) ). Par contre il est possible de faire d'autres programmes bien utiles grace à ça !!! Pour + d'info sur keybd-event() :
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx

exemple : "anti-idle" :

#include <stdio.h>
#include <windows.h> // le programme n'est donc pas multi-plateforme

int main()
{
while(1)
{
keybd_event(VK_RIGHT,0,0,0); // on indique l'appui de la fleche droite
Sleep(1); // On attend 1 milliseconde ( sleep() est plus conseillée que _sleep() )
keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0); // on indique le relachement de la touche
Sleep(1); // on attend encore
keybd_event(VK_LEFT,0,0,0); // et on se replace ( sinon on risque de se déplacer ^^ )
Sleep(1);
keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
Sleep(10000); // on attend 10 secondes avant de recommencer
}
}
1
merci beaucoup ;)
0
Azrael j'ai une question lorsque que j'utilise le code ci-dessus sur minecraft mon personnage ne bouge pas.

y'aurait-il une solution a ce problème ?
0
Hum ... augmente les délais peut-être ( il capte peut-être pas 1 ms d'appui ) sinon ... Je sais pas trop, je vais tenter de trouver un autre solution :/
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
13 mars 2013 à 15:10
Bonjour,
Voici un petit bout de code qui permet de faire un anti-idle :
#include <stdio.h>
#include <windows.h>

int main(void){
    char *nomfenetre="jeu anti-idle"; /* nom de la fenetre du jeu */
    HWND hnd=FindWindow(NULL,nomfenetre); /* recupere son handle */
    if(hnd){ /* si fenetre trouvee */
        while(1){ /* boucle sans fin */
            PostMessage(hnd,WM_KEYDOWN,VK_RIGHT,0); /* touche enfoncée */
            PostMessage(hnd,WM_KEYUP,VK_RIGHT,0); /* touche relachée */
            _sleep(10000); /* attend dix secondes */
        }
    } else printf("err\n"); /* si fenetre non trouvee */
    return 0;
}

L'adresse code des touches : https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
1

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

Posez votre question
geotop2013 Messages postés 5 Date d'inscription vendredi 15 mars 2013 Statut Membre Dernière intervention 15 mars 2013
15 mars 2013 à 14:14
il faut que tu utilises la fonction getchar() et que tu testes ensuite le caractère récupéré.
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 mars 2013 à 10:06
Je ne vois pas l'utilité de getchar() dans ce problème ?
0
moi non plus ^^
0