Simuler l'appui d'une touche en C

[Fermé]
Signaler
Messages postés
1
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
12 mars 2013
-
 under 2.2 -
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/
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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 !
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
53
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.
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 !
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
}
}
merci beaucoup ;)
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 ?
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 :/
ok merci beaucoup je testerai ca ;)
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
53
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
Messages postés
5
Date d'inscription
vendredi 15 mars 2013
Statut
Membre
Dernière intervention
15 mars 2013

il faut que tu utilises la fonction getchar() et que tu testes ensuite le caractère récupéré.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 773
Je ne vois pas l'utilité de getchar() dans ce problème ?
moi non plus ^^