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