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
under 2.2 - 25 nov. 2013 à 18:04
A voir également:
- Simuler l'appui d'une touche en C
- Touche rémanente - Guide
- Touche insert - Guide
- Quelle touche pour réinitialiser un ordinateur ? - Guide
- Quelle touche pour débloquer la souris ? - Guide
- Touche pgdn - Forum Excel
5 réponses
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 !
#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 !
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
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.
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
}
}
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
}
}
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
13 mars 2013 à 15:10
Bonjour,
Voici un petit bout de code qui permet de faire un anti-idle :
L'adresse code des touches : https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
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
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
15 mars 2013 à 14:14
il faut que tu utilises la fonction getchar() et que tu testes ensuite le caractère récupéré.
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
16 mars 2013 à 10:06
Je ne vois pas l'utilité de getchar() dans ce problème ?