Forum Clubic

Comment ecrire dans le registre du clavier - langage c++

Voila mon prob, je voudrais créé un prog qui puisse taper les code a ma place lrosque je joue a un jeux.
C’est une application que je lancerai avant de lancer mon jeux et lorsque j’appuierai sur une touche comme F1 par exemple le programme intercepterait la commande et la remplacerait par le bon code.
prob 1 : comme le jeu est prioritaire puisqu’il est en avant plan comment prendre la main sur le clavier ?
prob 2 : comment écrire dans le registre du clavier ?

voila si vous avez des idéés n’hésiter pas !!

ps : je sais que des prog de se type existe deja c’est juste un défi perso.

Merci de mettre le langage dans le titre (si il y en a un).

et l’environnement

Il faut que tu fasses un hook sur le clavier (avec SetWindowsHookEx) afin de récupérer les touches que tu tappes. Cette méthode impose d’utiliser une Dll à part.

Sinon il y a aussi GetKeyboardState qui te permet de récupérer les touches pressés sur le clavier. Mais cette possibilité (qui utilise pas de Dll) rend ton programme lent (il prend beaucoups de ressource et ne vois des fois pas des touches pressées rapidement).

Sinon pour émuler une touche pressée sur la clavier tu peux utiliser la fonction keybd_event.

EDIT: Je viens de voir sur MSDN: "Windows NT/2000/XP:This function has been superseded. Use SendInput instead."
Il faut donc utiliser SendInput et plus keybd_event (qui je crois, marche encore sous XP mais sans doute plus sous Vista…)

Sur cppfrance il y a qqun qui a fait une source pour expliquer le hook clavier ===> ici (il faut t’y inscririre si tu n’y es pas déjà, crois-moi, ca vaut le coup)

Et sur cppfrance aussi, il y a qqun dans le forum qui a posé une question sur le fonctionnement de SendInput et de keybd_event ===> ici

mais si sous Vista aussi ça marchera …

Ha bon sous Vista ça marchera? Mouai, c’est vrai que y a pas mal de programmes qui utilisent keybd_event, pour assurer la compatibilité ce serait mieux…

D’ailleur je me le demande, après combien de temps notre cher Billou enlève les APIs inusités (ou plutôt remplacé) ?

Bah il les enlève pas, même les API de Windows 3.0 sont toujours sous Windows 2000. Peut être que Vista abandonnera la compatibilité des API 16 bits. Mais aucune chance que ça se volatilise comme ça sans raison même si c’est déprécié.

Ha ok, intéréssant de le savoir.

Sinon si tu veux un peu d’aide pour ton code, voici deux fonctions qui utilisent SendInput (l’une pour bouger la souris et l’autre pour utiliser le clavier)

//Cette fonction place la souris aux coordonnées 0;0 de l'écran (en haut à gauche) et effectue un clique droite
void PlaceSouris()
{
    //Utilisation de SendInput pour bouger la souris (mais on peut aussi cliquer)
    INPUT ipt;
    ipt.type = INPUT_MOUSE;
    
    //Bouge la souris à un endroit voulu
    ipt.mi.dx = 0;    // <== Coordonnée X ou placer la souris
    ipt.mi.dy = 0;    // <== Coordonnée Y ou placer la souris
    ipt.mi.mouseData = 0;
    ipt.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; // <== Bouge la souris (avec comme coordonnée l'écran, et non un relatif)
    ipt.mi.time = 0;
    ipt.mi.dwExtraInfo = 0;
    SendInput(1, &ipt, sizeof(ipt));

    //Simule un clique droite
    memset( &ipt, 0, sizeof(INPUT) );
    ipt.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    SendInput(1, &ipt, sizeof(ipt));
         
}

//Cette fonction ouvre le blocnote pour ensuite écrire un petit texte dedans
void EcrClavier()
{
     //Message a écrire
     char* msgEcrire = "Longue vie à Clubic";
     
     STARTUPINFO sa = {0};
     PROCESS_INFORMATION pInfo = {0}; // <== récupère les infos sur le processus lancé
     if(!CreateProcess("C:\\WINDOWS\\notepad.exe", NULL, NULL, NULL, TRUE, NULL, NULL, NULL, &sa, &pInfo))
     {
          cout << "Erreur lors de l'ouverture du notepad!!!" << endl;                                              
     }
     
     Sleep(200); //Attente un petit moment pour que le notepad puisse s'ouvrire
     
     //Le notepad est maintenant ouvert ==> utilisation du clavier pour écrire un message
    INPUT ipt;
    ipt.type = INPUT_KEYBOARD;
    
    //Passage en revue de tous les caractères du message à écrire (j'aurais pu le faire en un appel à SendInput
    //puisque cet API accpete un tableau
    for( unsigned short NoCar = 0; NoCar < strlen(msgEcrire); NoCar++)
    {
         ipt.ki.wVk = (WORD) VkKeyScan ( *(msgEcrire + NoCar) );
         ipt.ki.wScan = (WORD) VkKeyScan ( *(msgEcrire + NoCar) );
         ipt.ki.dwFlags = KEYEVENTF_UNICODE;
         ipt.ki.time = 0;
         ipt.ki.dwExtraInfo = 0;
         
         SendInput(1, &ipt, sizeof(ipt));
    }    
}

Je n’ai pas encore fait la gestion des majuscules pour la fonction du clavier (le ‘C’ sort en ‘c’). Je modifie ça quand j’ai le temps.