Simuler l'appuie d'une touche de clavier
Simuler l'appuie d'une touche de clavier
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
Merci
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Simuler l'appuie d'une touche de clavier
Bonjour Jgame et bienvenue sur ce forum.
- 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 ?
Tu es débutant (c'est toi (si vous préférez le vouvoiement faites le moi savoir) qui le dit.Jgame a écrit :étant débutant
- 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 ?

Applications windows ? Web ?Jgame a écrit :j'aimerai créer un programme qui me logue sur tout mes compte
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Simuler l'appuie d'une touche de clavier
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 
ps: application windows

ps: application windows
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Simuler l'appuie d'une touche de clavier
■ 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.
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.
■ 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é.Jgame a écrit :j'aimerai créer un programme qui me logue sur tout mes compte
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
-
- Messages : 244
- Inscription : jeu. 07/mars/2013 19:02
- Localisation : France Alsace / Espagne Girona
Re: Simuler l'appuie d'une touche de clavier
Sur quoi comme compte ?
Justement ce que je cherche a faire...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.
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Re: Simuler l'appuie d'une touche de clavier
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)
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
Version de PB : 6.00LTS - 64 bits
-
- Messages : 355
- Inscription : dim. 01/déc./2013 15:29
Re: Simuler l'appuie d'une touche de clavier
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é.
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
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 !
Un homme doit être poli, mais il doit aussi être libre !
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Simuler l'appuie d'une touche de clavier
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
API Day en ce dimanche ? ha ha

Vous pouvez utiliser l'API Microsoft SetCursorPos_(x, y)
Exemple
Code : Tout sélectionner
SetCursorPos_(100,100)
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Simuler l'appuie d'une touche de clavier
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
- 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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Simuler l'appuie d'une touche de clavier
Il faut connaitre aussi
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...
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)
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...

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
Version de PB : 6.00LTS - 64 bits
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Simuler l'appuie d'une touche de clavier
Je n'ai pas de Mac pour tester ta demande, alors ça sera une démonstration pour environnement Windows (Testé avec windows 7)doudouvs a écrit :justement ce que je cherche a faire...
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
-
- Messages : 244
- Inscription : jeu. 07/mars/2013 19:02
- Localisation : France Alsace / Espagne Girona
Re: Simuler l'appuie d'une touche de clavier
merci @falsam effectivement ca marche nickel
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS