Page 1 sur 1

Simuler l'appuie d'une touche de clavier

Publié : sam. 24/janv./2015 14:38
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

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

Publié : sam. 24/janv./2015 15:01
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 ?

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

Publié : sam. 24/janv./2015 15:04
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

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

Publié : sam. 24/janv./2015 15:43
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é.

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

Publié : sam. 24/janv./2015 17:22
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...

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

Publié : sam. 24/janv./2015 22:20
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)

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

Publié : dim. 25/janv./2015 7:50
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é.

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

Publié : dim. 25/janv./2015 10:05
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 !

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

Publié : dim. 25/janv./2015 11:46
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

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

Publié : dim. 25/janv./2015 12:23
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


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

Publié : dim. 25/janv./2015 15:53
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:

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

Publié : dim. 25/janv./2015 23:54
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

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

Publié : lun. 26/janv./2015 9:16
par doudouvs
merci @falsam effectivement ca marche nickel