Utilisation de keybd_event [Résolu]

filoxera 6 Messages postés jeudi 4 juillet 2002Date d'inscription 13 juin 2008 Dernière intervention - 9 juin 2008 à 08:49 - Dernière réponse : filoxera 6 Messages postés jeudi 4 juillet 2002Date d'inscription 13 juin 2008 Dernière intervention
- 13 juin 2008 à 15:37
Bonjour,
J'utilise Visual C++  de Visualstudio 2005 pour envoyer un mot de passe à une application,
Lorsque je fait:
keybd_event(0x62,0,0,0); //caractere 2
sleep(200);
keybd_event(0x60,0,0); // caractere 0
sleep(200);
keybd_event(0x50,0,0,0); //caractere p
sleep(200);
keybd_event(0x46,0,0,0); // caractere f
sleep(200);
keybd_event(VK_RETURN,0x0d,0,0);
tout se passe très bien
Je voudrais sans faire keybd_event pour chaque caractere, faire une boucle qui envoi
chaque caractere de mon mot de passe("20pf"), genre
do while 'fin du mot de passe'
keybd_event( code du caractere,0,0,0);
loop
Merci pour votre aide
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 10:15
3
Merci
Bonjour,

Quelque chose comme ça :

const char* szMotDePasse = "20pf";
for (int i=0 ; szMotDePasse[i] ; ++i)
{
   keybd_event(szMotDePasse[i],0,0,0);
   Sleep(200);
}
keybd_event(VK_RETURN,0x0d,0,0);

Jean-François

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
Meilleure réponse
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 21:12
3
Merci
Après quelques recherches sur Internet et quelques essais (en simulant l'écriture d'un texte dans une zone de saisie d'un programme windows), voici ce que j'obtiens (qui marche bien avec les chiffres et les lettres quelque soit le mode majuscule/minuscule du clavier, rien avec les autres caractères !) :

#include <windows.h>

void SimulerClavier
(
    const char* pszChaine // E:chaîne à envoyer
   ,int         iTempo    // E:tempo entre les caractères (ms)
)
{
   // --- Lire l'état actuel du clavier MAJ/min
   BYTE aKeyState[256];
   GetKeyboardState((LPBYTE)&aKeyState);
   bool bMin = ! (bool)(aKeyState[VK_CAPITAL] & 1);






   // --- Envoyer la chaîne caractère par caractère
   const char* pc = pszChaine;
   while (*pc)
   {
      if (*pc >= '0'  &&  *pc <= '9')
      {
         // --- Chiffre avec simulation de l'appui sur la touche SHIFT
         // --- (pour passer en mode majuscule pour obtenir les chiffres)
         if (bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0);
         keybd_event(*pc,0,0,0); // appui
         keybd_event(*pc,0,KEYEVENTF_KEYUP,0); // relâche
         if (bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);
      }
      else if (*pc >= 'a'  &&  *pc <= 'z')
      {
         // --- Lettre minuscule avec simulation de l'appui sur la touche
         // --- SHIFT (pour repasser en mode minuscule)
         char cMaj = *pc - 'a' + 'A'; // min --> maj
         if (! bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0);
         keybd_event(cMaj,MapVirtualKey(cMaj,0),0,0); // appui
         keybd_event(cMaj,MapVirtualKey(cMaj,0),KEYEVENTF_KEYUP,0); // relâche
         if (! bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);
      }
      else if (*pc >= 'A'  &&  *pc <= 'Z')
      {
         // --- Lettre majuscule avec simulation de l'appui sur la touche
         // --- SHIFT (pour passer en mode majuscule)
         if (bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0);
         keybd_event(*pc,MapVirtualKey(*pc,0),0,0); // appui
         keybd_event(*pc,MapVirtualKey(*pc,0),KEYEVENTF_KEYUP,0); // relâche
         if (bMin) keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);
      }
      else
      {
         // --- Autre caractère
         keybd_event(*pc,MapVirtualKey(*pc,0),0,0); // appui
         keybd_event(*pc,MapVirtualKey(*pc,0),KEYEVENTF_KEYUP,0); // relâche
      }
      ++pc; // caractère suivant




      // --- Tempo entre chaque caractère
      Sleep(iTempo);
   }




   // --- Envoyer le retour chariot final
   keybd_event(VK_RETURN,0x0D,0,0);
}





int main(void)
{
   SimulerClavier("20pf",200);
   system("pause");
   return 0;
}




Jean-François

Merci cs_jfrancois 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de cs_jfrancois
filoxera 6 Messages postés jeudi 4 juillet 2002Date d'inscription 13 juin 2008 Dernière intervention - 9 juin 2008 à 14:40
0
Merci
Merci beaucoup Jean François, cela fonctionne très bien.
Mais dans l'application qui recoit le mote de passe, j'ai le message mot de passe invalide?
Je me demande si dans keybd_event( szMotDePasse[i],0,00), le szMotDePasse[i] ne devrait pas être transformé en Ox62 pour le '2' Ox60 pour le '0' etc...


Comment faire ?
Merci si tu as une idée
Commenter la réponse de filoxera
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 14:54
0
Merci
Jean-François
Commenter la réponse de cs_jfrancois
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 15:07
0
Merci
Mystère ! la réponse a été vidée !

Les codes ASCII 0x62 et 0x60 ne sont pas ceux de '2' et '0' mais ceux de 'b' et '`' (apostrophe inversée).

Essayer avec const char* szMotDePasse = "\x62\x60pf";
ou avec const char* szMotDePasse = "b`pf";

Jean-François
Commenter la réponse de cs_jfrancois
filoxera 6 Messages postés jeudi 4 juillet 2002Date d'inscription 13 juin 2008 Dernière intervention - 9 juin 2008 à 17:15
0
Merci
En effet avec "\x62\x60\x50\x46" ça fonctionne, mais pas avec " \x62\60pf"
Il faudra donc je transforme mon mot de passe avec un tableau de correspondance genre 
switch szMotDepasse[i]
case 0:
szMotDePasse[i]=\x60
case 1:
szMotDePae[i]=\x61
case 2:
szMotDePasse|i]=\x62
.
.
Est-ce que je peux garder szMotDepasse[i](qui est un char) ou il faut que j'utilise une autre variable?
Merci encore Jean François pour cette aide précieuse
Commenter la réponse de filoxera
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 18:22
0
Merci
La fonction keybd_event() n'est pas d'une utilisation aussi simple !

Le premier paramètre de la fonction n'est pas le code ASCII du caractère à simuler mais un code virtuel correspondant. 0x60 et 0x62 sont les codes associés aux constantes VK_NUMPAD0 et VK_NUMPAD2 qui correspondent aux touches 0 et 2 du pavé numérique. Comme les codes 0x30 à 0x39 sont sensés correspondrent aux touches 0 à 9 (codes ASCII = codes virtuels pour ces touches là) je ne comprends pas pourquoi le mot de passe n'est pas compris !
 
Les lettres ont aussi le même code virtuel que le code ASCII (des lettres majuscules) et la touche NUM LOCK est prise en compte pour générer des minuscules ou des majuscules. Dans \x62\x60\x50\x46, \50\x46 = PF et non pf ! mais comme votre clavier doit être en mode minuscule c'est bien pf qui est généré. Si vous passez le clavier en majuscule, ça n'est plus reconnu ?

Jean-François
Commenter la réponse de cs_jfrancois
cs_jfrancois 482 Messages postés vendredi 26 août 2005Date d'inscription 5 décembre 2009 Dernière intervention - 9 juin 2008 à 18:26
0
Merci
CAPS LOCK pour les minuscules/majuscules et non NUM LOCK !

Jean-François
Commenter la réponse de cs_jfrancois
filoxera 6 Messages postés jeudi 4 juillet 2002Date d'inscription 13 juin 2008 Dernière intervention - 13 juin 2008 à 15:37
0
Merci
Merci beaucoup Jean François pour cette recherche.
Je vais essayer d'intégrer cela dans mon code.
Commenter la réponse de filoxera

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.