Simuler l'appuie d'une touche de clavier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Jgame
Messages : 2
Inscription : sam. 24/janv./2015 14:35

Simuler l'appuie d'une touche de clavier

Message par Jgame »

Voila j'aimerai créer un programme qui me logue sur tout mes compte, étant débutant je cherche un moyen de pouvoir simuler l'appuie d'une touche de clavier.
Merci
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simuler l'appuie d'une touche de clavier

Message par falsam »

Bonjour Jgame et bienvenue sur ce forum.
Jgame a écrit :étant débutant
Tu es débutant (c'est toi (si vous préférez le vouvoiement faites le moi savoir) qui le dit.

- Utilises tu une version démo ?
- Quel est le system d'exploitation de ton ordinateur ?
- As tu déja fait de la programmation ?
- Connais tu le system de recherche sur un forum ? :mrgreen:
Jgame a écrit :j'aimerai créer un programme qui me logue sur tout mes compte
Applications windows ? Web ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Jgame
Messages : 2
Inscription : sam. 24/janv./2015 14:35

Re: Simuler l'appuie d'une touche de clavier

Message par Jgame »

Oui pour l'instant j'utilise la version démo, je suis sous windows, je commence juste la programmation et oui j'ai chercher en vain sur les forum pour trouver ma solution :D
ps: application windows
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simuler l'appuie d'une touche de clavier

Message par falsam »

■ Avec Pure Basic version démo, tu peux produire un logiciel qui communique des informations à un autre logiciel codé lui aussi en Pure Basic.

Voir l'aide consacré à RunProgram()
http://www.purebasic.com/french/documen ... ogram.html

■ Pure Basic démo ou commercial ne permet pas en natif de communiquer avec un logiciel qui n'a pas été codé lui aussi en Pure Basic.

■ Par contre dans la version commerciale, il est possible d'utiliser des fonctionnalités propre à Windows (ou linux, ou Mac OS) grâce à une interface de programmation appelée API qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels non développés avec Pure Basic : Comme par exemple passer des paramètres d'identification utilisateur.
Jgame a écrit :j'aimerai créer un programme qui me logue sur tout mes compte
■ Ce sytem d'API n'est pas inclus dans la version de démonstration et donc par conséquence, tu ne pourras pas pour le moment tester cette fonctionnalité.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: Simuler l'appuie d'une touche de clavier

Message par doudouvs »

Sur quoi comme compte ?

falsam a écrit : API qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels non développés avec Pure Basic : Comme par exemple passer des paramètres d'identification utilisateur.
Justement ce que je cherche a faire...
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Simuler l'appuie d'une touche de clavier

Message par Fig »

Code : Tout sélectionner

Procedure SimulerTouche(touche.i)
   ;appuie de la touche
    keybd_event_(touche,0,0,0)
   ;relachement de la touche
    keybd_event_(touche,0,#KEYEVENTF_KEYUP,0)
EndProcedure
SimulerTouche(#VK_RETURN)
Si tu as acheté Purebasic, tu peux simuler une touche ainsi... Mais uniquement sur windows.
Dans cet exemple on simule la touche "return".

Sur le même principe on peut simuler le placement et clic de la souris...

Code : Tout sélectionner

Procedure SimulerSouris(X.i,Y.i)
    ;appuie clic gauche et positionnement de la souris
     mouse_event_(#MOUSEEVENTF_LEFTDOWN,X,Y, 0, 0)
     delay(150)
    ;relachement du clic gauche
     mouse_event_(#MOUSEEVENTF_LEFTUP, X,Y, 0, 0)
     delay(150)
EndProcedure()
SimulerSouris(10,10)
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Simuler l'appuie d'une touche de clavier

Message par Lord Nelson »

Salut,

Par contre X et Y ne semble pas fonctionner chez moi.
Le clic se fais bien mais la position de la souris reste inchangé.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Simuler l'appuie d'une touche de clavier

Message par Micoute »

Bonjour à tous, même problème pour moi, la souris reste là où je l'ai mise et il n'y a pas de parenthèses à EndProcedure !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simuler l'appuie d'une touche de clavier

Message par falsam »

Je me demande bien ce que vous voulez faire avec ses API ? pour le fun ? Mais bon ...... ça ne me regarde pas :)

Vous pouvez utiliser l'API Microsoft SetCursorPos_(x, y)

Exemple

Code : Tout sélectionner

SetCursorPos_(100,100)
API Day en ce dimanche ? ha ha
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simuler l'appuie d'une touche de clavier

Message par falsam »

Un exemple qui ne sert à rien mais qui permet de voir ce qu'il est possible de faire avec les API Windows

- Ouvrir la calculatrice Windows
- Additionner 29 + 3

Code : Tout sélectionner

Global ExeHwnd.l ;Handle de l'application externe

Procedure Dummy(hwnd)
  ;Je n'ai pas trouvé ce qui pouvait simuler la touche "=" dans les constantes de PureBasic
  #VK_EQUAL=187
  
  ;Simule le chiffre 29
  PostMessage_(hWnd, #WM_KEYUP , #VK_NUMPAD2, 0)
  PostMessage_(hWnd, #WM_KEYUP , #VK_NUMPAD9, 0)
  
  ;Simule le chiffre +
  PostMessage_(hWnd, #WM_KEYUP , #VK_ADD, 0)
  
  ;Simule le chiffre 3
  PostMessage_(hWnd, #WM_KEYUP , #VK_NUMPAD3, 0)
  
  ;De-commenter cette ligne pour voir ce qui c'est passé precedement.
  ;Delay(2000)
  
  ;Simule le chiffre =
  PostMessage_(hWnd, #WM_KEYUP , #VK_EQUAL, 0)
  
EndProcedure 

;-Start
RunProgram("calc")

;Soyons certain que calc est bien affiché
Delay(1000)
  
;Cherche le handle de l'application externe en se servant du titre de la fenetre (Exemple pour calc.exe)
ExeHwnd = FindWindow_(0, "Calculatrice")

If ExeHwnd
  Dummy(ExeHwnd)
  
  ;D'autres préféreront cette fonctionnalité qui permet d'énumérer l'ensemble des fenêtre filles 
  ;Mais je ne vois pas l’intérêt dans cet exemple.
  
  ;EnumChildWindows_(ExeHwnd, @Dummy(), ExeHwnd)     
EndIf

Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Simuler l'appuie d'une touche de clavier

Message par Fig »

Il faut connaitre aussi

Code : Tout sélectionner

Procedure Pxlcolor(X,Y)
  hWnd=GetDesktopWindow_()
  HDC = GetDC_(hWnd)
  A.i=GetPixel_(HDC,X,Y)
  ;SetPixel_(GetDC_(GetDesktopWindow_()),X,Y,#Red)
  ReleaseDC_(hWnd,HDC)
  ProcedureReturn A
EndProcedure
debug Pxlcolor(10,10)
Ca lit la couleur d'un pixel aux coordonnées 10,10 dans cet exemple.

Et aussi
SetPixel_(GetDC_(GetDesktopWindow_()),X,Y,#Red)
Qui passe en rouge dans cet exmeple un point sur l'écran (utile pour aligner un élément du jeu afin d'avoir un repère pour le reste de l'automatisation..)

J'ai une procedure qui déplace la souris en faisant des lignes presque droite et en gérant le ralentissement à la fin comme le ferait un être humain, si ca vous intéresse...

Une autre remarque, étrangement, ce genre de programme pourtant potentiellement hautement dangereux pour un pc, n'est pas du tout détecté comme viral par les antivirus... Sont vraiment nuls décidément... :lol:
Dernière modification par Fig le mar. 03/févr./2015 21:25, modifié 1 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simuler l'appuie d'une touche de clavier

Message par falsam »

doudouvs a écrit :justement ce que je cherche a faire...
Je n'ai pas de Mac pour tester ta demande, alors ça sera une démonstration pour environnement Windows (Testé avec windows 7)

Je pense qu'il est possible de faire la même chose avec les API OSx.

J'ai compilé et arrangé quelques codes fourni par la communauté Pure Basic (Rashad et Danilo) afin de prendre le contrôle d'une application.

■ Principe.
- Obtenir le Handle de l'application à piloté.
- Obtenir les dimensions et positions de l'application.
- Positionner le curseur de la souris sur un objet de l'application (Bouton, Menu, Champ de saisie, etc ...)
- Envoyer des données à l'application sans passer par le handle de class d'un objet.
- Simuler le clic droit ou gauche de la souris pour valider des opérations.

■ Une démo.
- Ouverture de Notepad.exe
- Transmission d'un texte.
- Sauvegarde du fichier.

■ Le code contient différentes procédures qui pourraient figurer dans un include.
La zone de test se situe en fin de code.

Code : Tout sélectionner

;-A mettre dans un include

;Trouve le handle d'une application externe avec le titre de sa fenetre
Procedure GetWindowHandle(windowName.s)
  Protected hWnd, tWnd.s
  
  hWnd = GetWindow_(GetDesktopWindow_(), #GW_CHILD)
  While hWnd
    tWnd = Space(GetWindowTextLength_(hWnd) + 2)
    GetWindowText_(hWnd, tWnd, Len(tWnd))
    If FindString(LCase(tWnd), LCase(windowName))
      ProcedureReturn hWnd
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend
  ProcedureReturn 0
EndProcedure

;Change les dimensions et position d'une application externe
Procedure SetWindowPosition(windowHandle, *position.RECT)
  Protected wFlags
  
  wFlags = #SWP_NOZORDER | #SWP_SHOWWINDOW
  With *position
    SetWindowPos_(windowHandle, #HWND_TOP, \left, \top, \right - \left, \bottom - \top, wFlags)
  EndWith
EndProcedure

;Obtenir les dimensions et position d'une application externe
Procedure GetWindowPosition(windowHandle, *position.RECT)
  GetWindowRect_(windowHandle, *position)
EndProcedure

;Simule le click gauche
Procedure LeftClick ()
  Protected In.INPUT
  
  ;Left down 
  In\type        = #INPUT_MOUSE
  In\mi\dwFlags  = #MOUSEEVENTF_LEFTDOWN
  SendInput_(1,@In,SizeOf(INPUT))

  ;Left up
  In\mi\dwFlags  = #MOUSEEVENTF_LEFTUP
  
  SendInput_(1,@In,SizeOf(INPUT))
EndProcedure

;Simule le click droit
Procedure RightClick ()
  Protected In.INPUT
  
  ;Right down 
  In\type        = #INPUT_MOUSE
  In\mi\dwFlags  = #MOUSEEVENTF_RIGHTDOWN
  SendInput_(1,@In,SizeOf(INPUT))

  ;Right up
  In\mi\dwFlags  = #MOUSEEVENTF_RIGHTUP

  SendInput_(1,@In,SizeOf(INPUT))
EndProcedure

;Simule le déplacement de la souris
Procedure MouseMove (x, y)
  Protected In.INPUT, fScreenWidth, fScreenHeight, fx, fy
  
  fScreenWidth   = GetSystemMetrics_( #SM_CXSCREEN )-1 
  fScreenHeight  = GetSystemMetrics_( #SM_CYSCREEN )-1 
  fx = x*(65535/fScreenWidth)
  fy = y*(65535/fScreenHeight)
  In\type        = #INPUT_MOUSE;
  In\mi\dwFlags  = #MOUSEEVENTF_MOVE|#MOUSEEVENTF_ABSOLUTE
  In\mi\dx       = fx
  In\mi\dy       = fy

  SendInput_(1,@In,SizeOf(INPUT))
EndProcedure

;Envoyer des données au champ éditable en cours.
Procedure SendInput(*txt) 
  Protected *idata = AllocateMemory(SizeOf(INPUT)*2) 
  Protected *inputdata.INPUT, onekey.INPUT 
  Protected *key.CHARACTER = *txt 
  Protected key.w, keyvalue, shift
  
  While *key\c 
    
    ; Translate the character to its virtual key code
    ; and see if it requires SHIFT to be pressed
    
    key = VkKeyScan_(*key\c) 
    keyvalue = key & $FF 
    shift    = key >> 8 
    
    ; Press SHIFT if indicated
    
    If shift 
      RtlZeroMemory_(onekey,SizeOf(INPUT)) 
      With onekey 
        \type   = #INPUT_KEYBOARD 
        \ki\wVk = #VK_SHIFT 
      EndWith 
      SendInput_(1, onekey, SizeOf(INPUT)) 
    EndIf 
    
    ; Press the character key down
    
    *inputdata = *idata 
    RtlZeroMemory_(*idata,SizeOf(INPUT)*2) 
    
    With *inputdata 
      \type   = #INPUT_KEYBOARD 
      \ki\wVk = keyvalue 
    EndWith 
    
    ; Release the character key
    
    *inputdata + SizeOf(INPUT) 
    
    With *inputdata 
      \type       = #INPUT_KEYBOARD 
      \ki\wVk     = keyvalue 
      \ki\dwFlags = #KEYEVENTF_KEYUP 
    EndWith 
    
    SendInput_(2, *idata, SizeOf(INPUT)) 

    ; Release the SHIFT key if we pressed it
    
    If shift 
      RtlZeroMemory_(onekey,SizeOf(INPUT)) 
      With onekey 
        \type       = #INPUT_KEYBOARD 
        \ki\wVk     = #VK_SHIFT 
        \ki\dwFlags = #KEYEVENTF_KEYUP          
      EndWith 
      SendInput_(1, onekey, SizeOf(INPUT)) 
    EndIf 
    
    ; Process next character if there is one
    
    *key+1 
  Wend      
EndProcedure 


;***************************
;- Zone de test            *
;***************************
EnableExplicit

;Handle de l'application controlée
Global Handle 

;Handle de la class controlée
Global HandleClass 

;Position et dimension de l'application contrôlée
Global x, y, width, height, Buffer.s
Global windowPosition.RECT

;Position du curseur
Global cursorPosition.POINT

;On lance notepad
RunProgram("notepad")

;Laissons lui le temps de s'installer
Delay(1000)

;Handle de l'application contrôlée
;Une partie du titre suffit pour obtenir l'information
Handle = GetWindowHandle("Bloc-notes")

;Quel sont la position et dimension de l'application externe
GetWindowPosition(Handle, @windowPosition)

With windowPosition
  x     = \left
  y     = \top
  width = \right - \left
  height= \bottom - \top
EndWith

;Ajoutons du texte dans l'éditeur
Buffer = "Position et dimention de l'éditeur Notepad" + #CR$
Buffer + "Left = " + Str(x) + #CR$
Buffer + "Right = " + Str(y) + #CR$
Buffer + "Width = " + Str(width) + #CR$
Buffer + "Height = " + Str(height) + #CR$

;Ajoutons le texte (Variable Buffer)
;SendMessage_(HandleClass, #WM_SETTEXT,0, Buffer)
SendInput(@Buffer)

;Il est temps de sauvegarder 
;Positionnement du pointeur de la souris sur le menu Fichier puis clic
MouseMove(x+30, y+40)
LeftClick()

;Positionnement du pointeur de la souris sue le menu Sauvegarder
MouseMove(x+30, y+120)
LeftClick()

;La fenetre de sauvegarde s'ouvre on laisse un peu de delay
Delay(1000)

;La fenetre étant la fenêtre courante, il est inutile de cherche son handle
;Le curseur par défaut se positionne sur le nom du fichier
;Donnons un nom accompagné de la touche entrée
Buffer = "test.txt" + #CR$
SendInput(@Buffer)

;Voila c'est fini
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: Simuler l'appuie d'une touche de clavier

Message par doudouvs »

merci @falsam effectivement ca marche nickel
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Répondre