Simulation du clavier/souris

Soyez le premier à donner votre avis sur cette source.

Vue 22 581 fois - Téléchargée 838 fois

Description

Voila deux fonctions une pour simuler un clic gauche de souris (SimulerMouse) qui prend deux argument les coordonnées x et y de la position du pointeur

la deuxième fonction : SimulerKey permet de simuler une ou plusieurs combinaison de touches

ex: simulation de la touche 'r' : SimulerKey(0x52, 0, 0, 1);
simulation de la combinaison de touches : ALT+ENTRER : SimulerKey(VK_MENU, VK_RETURN, 0, 2);
simulation de la combinaison de touches : CTRL+ALT+à (touche @) : SimulerKey(VK_CONTROL, VK_MENU, 0x30, 3);

les code des touches sont disponible ici :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/UserInput/VirtualKeyCodes.asp

Source / Exemple :


void SimulerMouse(int x, int y)
{
  // Définir la position du curseur de al souris
  SetCursorPos(x, y);

  // Simule l'action de clic du bouton gauche de la souris
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

  // Simule l'action de relâcher du bouton gauche de la souris
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
//---------------------------------------------------------------------------

void SimulerKey(int x, int y, int z, int nbre)
{
  if(nbre == 1)
  {
    switch(x)
    {
    // Lettres
      case 'a':
        x = 0x41;
        break;
      case 'b':
        x = 0x42;
        break;
      case 'c':
        x = 0x43;
        break;
      case 'd':
        x = 0x44;
        break;
      case 'e':
        x = 0x45;
        break;
      case 'f':
        x = 0x46;
        break;
      case 'g':
        x = 0x47;
        break;
      case 'h':
        x = 0x48;
        break;
      case 'i':
        x = 0x49;
        break;
      case 'j':
        x = 0x4a;
        break;
      case 'k':
        x = 0x4b;
        break;
      case 'l':
        x = 0x4c;
        break;
      case 'm':
        x = 0x4d;
        break;
      case 'n':
        x = 0x4e;
        break;
      case 'o':
        x = 0x4f;
        break;
      case 'p':
        x = 0x50;
        break;
      case 'q':
        x = 0x51;
        break;
      case 'r':
        x = 0x52;
        break;
      case 's':
        x = 0x53;
        break;
      case 't':
        x = 0x54;
        break;
      case 'u':
        x = 0x55;
        break;
      case 'v':
        x = 0x56;
        break;
      case 'w':
        x = 0x57;
        break;
      case 'x':
        x = 0x58;
        break;
      case 'y':
        x = 0x59;
        break;
      case 'z':
        x = 0x5a;
        break;

    // Chiffres avec le vérouillage numérique
      case '0':
        x = 0x60;
        break;
      case '1':
        x = 0x61;
        break;
      case '2':
        x = 0x62;
        break;
      case '3':
        x = 0x63;
        break;
      case '4':
        x = 0x64;
        break;
      case '5':
        x = 0x65;
        break;
      case '6':
        x = 0x66;
        break;
      case '7':
        x = 0x67;
        break;
      case '8':
        x = 0x68;
        break;
      case '9':
        x = 0x69;
        break;
      case '.':
        x = 0x6e;
        break;

    // Chiffres au dessus des lettres
      case 'à':
        y = 0x30;
        break;
      case '&':
        y = 0x31;
        break;
      case 'é':
        y = 0x32;
        break;
      case '"':
        y = 0x33;
        break;
      case '\'':
        y = 0x34;
        break;
      case '(':
        y = 0x35;
        break;
      case '-':
        y = 0x36;
        break;
      case 'è':
        y = 0x37;
        break;
      case '_':
        y = 0x38;
        break;
      case 'ç':
        y = 0x39;
        break;
      default:
        break;
    }
  }

  if(nbre == 2)
  {
    switch(y)
    {
    // Lettres
      case 'a':
        y = 0x41;
        break;
      case 'b':
        y = 0x42;
        break;
      case 'c':
        y = 0x43;
        break;
      case 'd':
        y = 0x44;
        break;
      case 'e':
        y = 0x45;
        break;
      case 'f':
        y = 0x46;
        break;
      case 'g':
        y = 0x47;
        break;
      case 'h':
        y = 0x48;
        break;
      case 'i':
        y = 0x49;
        break;
      case 'j':
        y = 0x4a;
        break;
      case 'k':
        y = 0x4b;
        break;
      case 'l':
        y = 0x4c;
        break;
      case 'm':
        y = 0x4d;
        break;
      case 'n':
        y = 0x4e;
        break;
      case 'o':
        y = 0x4f;
        break;
      case 'p':
        y = 0x50;
        break;
      case 'q':
        y = 0x51;
        break;
      case 'r':
        y = 0x52;
        break;
      case 's':
        y = 0x53;
        break;
      case 't':
        y = 0x54;
        break;
      case 'u':
        y = 0x55;
        break;
      case 'v':
        y = 0x56;
        break;
      case 'w':
        y = 0x57;
        break;
      case 'x':
        y = 0x58;
        break;
      case 'y':
        y = 0x59;
        break;
      case 'z':
        y = 0x5a;
        break;

    // Chiffres au dessus des lettres
      case '0':
        y = 0x30;
        break;
      case '1':
        y = 0x31;
        break;
      case '2':
        y = 0x32;
        break;
      case '3':
        y = 0x33;
        break;
      case '4':
        y = 0x34;
        break;
      case '5':
        y = 0x35;
        break;
      case '6':
        y = 0x36;
        break;
      case '7':
        y = 0x37;
        break;
      case '8':
        y = 0x38;
        break;
      case '9':
        y = 0x39;
        break;
      default:
        break;
    }
  }

  if(nbre == 3)
  {
    switch(z)
    {
    // Chiffres au dessus des lettres
      case '@':
        z = 0x30;
        break;
      case '~':
        z = 0x32;
        break;
      case '#':
        z = 0x33;
        break;
      case '{':
        z = 0x34;
        break;
      case '[':
        z = 0x35;
        break;
      case '|':
        z = 0x36;
        break;
      case '`':
        z = 0x37;
        break;
      case '\\':
        z = 0x38;
        break;
      case '^':
        z = 0x39;
        break;
      default:
        break;
    }
  }

	keybd_event(x,0,0,0);
  if(nbre==2 || nbre ==3)
	  keybd_event(y,0,0,0);
  if(nbre==3)
  {
	  keybd_event(z,0,0,0);
	  keybd_event(z,0,KEYEVENTF_KEYUP,0);
  }
  if(nbre==2 || nbre ==3)
	  keybd_event(y,0,KEYEVENTF_KEYUP,0);
	keybd_event(x,0,KEYEVENTF_KEYUP,0);
}
//---------------------------------------------------------------------------

Conclusion :


Le code m'a l'air assez simple je l'ai fait parce que j'ai eu du mal a trouver comment cela marche.

Si cela peut aider des jeunes développeurs tant mieux.

++ Nexus

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

Ah okay enfait seul 2 arguments dans cette fonction sont utiles
xD

Merci pour ses explications presque 5 ans après !
Ca te replonge dans le BON VIEUX TEMPS n'est-ce pas ?
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

Extrainfo ca sert pas a grand chose.
Je ne saurais pas te le dire avec certitude mais c'est une histoire de variable que tu associe en plus de ta valeur du clavier.
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

En gros bScan ça sert à rien!

Et dwExtraInfo c'est quoi?

Merci et bonne soirée ;p
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

Autant pour moi ;)

La documentation MSDN laisse comme exemple pour dwFlags ceci :
[in] Specifies various aspects of function operation. This parameter can be one or more of the following values.
KEYEVENTF_EXTENDEDKEY
If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
KEYEVENTF_KEYUP
If specified, the key is being released. If not specified, the key is being depressed.

En gros soit il rajoute un prefix au code de la touche avec la valeur 0xE0.
(A ma connaissance je ne connais pas cette utilité).
Soit il utilise la variable KEYEVENTF_KEYUP pour relâcher le bouton.
La MSDN utilise pour appuyer sur un bouton : KEYEVENTF_EXTENDEDKEY | 0
et pour relacher le bouton : KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP

le fonction bScan est la même variable que bVk sauf qu'il indique le code en hexa tandis que bVk peut utiliser des touches avec leur define (ex: VK_.....)
Voici un exemple pour le bouton vérouillage numérique : (VK_NUMLOCK, 0x45, 0, 0)
On lui a spécifié ici la valeur "virtuelle" VK_NUMLOCK ainsi que ca valeur en hexa 0x45

Bonne soirée,
Stéphane.
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

On est bien daccord !

Sur msdn il ya ça

VOID keybd_event(
BYTE bVk,
BYTE bScan,
DWORD dwFlags,
DWORD dwExtraInfo
);

bVk
[in] Specifies a virtual-key code. The code must be a value in the range 1 to 254. For a list of virtual-key codes, see Translating Scan Codes to Virtual-Key Codes.

bScan
[in] Specifies a hardware scan code for the key.

dwFlags
[in] Specifies various aspects of function operation. An application can use any combination of the following predefined constant values to set the flags.

dwExtraInfo
[in] Specifies an additional 32-bit value associated with the keystroke.

Et j'ai pas compris a quoi correspondait le deuxième et troisième argument de cette fonction (bScan et dwExtraInfo)
Afficher les 18 commentaires

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.