Capture & reproduction d'évènements CLAVIER et SOURIS :-s

youkizouki Messages postés 82 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 12 octobre 2005 - 2 mars 2005 à 14:02
youkizouki Messages postés 82 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 12 octobre 2005 - 30 sept. 2005 à 21:24
bonjour,

je dois creer une application que enregistre sous forme de macro tout les evenements graphiques de la souris (déplacements et cliques) MAIS AUSSI "toutes" les frappes clavier faites par l'utilisateur afin de les reproduires en boucle sans avoir a etre present physiquement devant la machine.

pour enregistrer les evenement souris je pense utiliser les API :
* getCursorPos (recupere position de la souris)
* getKeyState (pour enregistrer les cliques bouton)

pour reproduire les evenements souris l'API :
* mouse_event

LE PROBLEME EST QUE JE DOIS EGALEMENT ENREGISTRER LES FRAPPES CLAVIER AFIN DE LES RESTITUER AU BON ENDROIT (dans la bonne zone de texte) AU BON MOMENT...

l'api getKeyState permet de tester aussi bien le "statut" des boutton souris que clavier donc pour la capture pas trop de probleme mais avez vous une idée sur l'API a utiliser pour reproduire aussi bien les évenements souris que clavier car "mouse_event" ne gere que la souris...

j epensais utiliser l'API keybd_event pour reproduire les evenements clavier mais je doute !
Est-il vrai que l'API sendInput permet de generer tant des evenement clavier que souris
http://www.posse-press.com/forum/showthread.php?threadid=22245

Rmq: pour effectuer la capture j'utilise un timer qui enregistre dans un tableau toutes les X millisecondes la ainsi que l'état des touches du clavier mais pour cela je dois utiliser une seule API qui generera soit des evenements clavier soit souris en fonction de ce que contient le tableau et non deux API différentes (mouse_event ou kybd_event) car pour restituer le text dans la bonne zone je devrais deplacer le curseur jusque la zone de texte, cliquer et ensuite seulement ecrire...

je sais que ce n'est peut etre pas évident a comprendre et je me tient a votre disposition pour tout renseignements complémentaires...

je tiens dors et déjà a remercier toutes les personnes qui prendront le temps de lire ce long et ennuyeux message...

a tres bientot j'espère !

mika

--------------------------------------------------
Visual Basic 6.0 (projet pour plateform NT 4.0)

3 réponses

radcur Messages postés 282 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 15 août 2012 2
3 mars 2005 à 00:46
salut



pour les api, je peux te suggérer de rechercher sur 2 sites www.progotop.com et www.allapi.net.



VB6 contient un add-in aussi pour les api. Je te recommende d'y jeter un coup d'oeil.
0
STEPH_3D Messages postés 2 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 19 avril 2006
20 sept. 2005 à 23:09
Je découvre les API et tente de trouver une méthode pour utiliser les touches du clavier afin de me déplacer dans le menu d'une fenêtre créée en API. Pas évident !

J'ai trouvé une adresse (c'est en anglais) qui peut donner des idées :
http://www.awprofessional.com/articles/article.asp?p=366892&seqNum=4&rl=1

Maintenant pour l'utiliser, j'essaie de comprendre (boucle ?, timer ?) . A voir.

A vous de découvrir et bonne chance !

En voici une partie :
Listing 9-9 shows the full code to check for a key press.
'Type to hold the coordinates of the mouse pointer
Private Type POINTAPI
x As Long
y As Long
End Type

'Type to hold the Windows message information
Private Type MSG
hWnd As Long 'the window handle of the app
message As Long 'the type of message (e.g. keydown)
wParam As Long 'the key code
lParam As Long 'not used
time As Long 'time when message posted
pt As POINTAPI 'coordinate of mouse pointer
End Type

'Look in the message buffer for a message
Private Declare Function PeekMessage Lib "user32" _
Alias "PeekMessageA" _
(ByRef lpMsg As MSG, ByVal hWnd As Long, _
ByVal wMsgFilterMin As Long, _
ByVal wMsgFilterMax As Long, _
ByVal wRemoveMsg As Long) As Long

'Translate the message from a key code to a ASCII code
Private Declare Function TranslateMessage Lib "user32" _
(ByRef lpMsg As MSG) As Long

Windows API constants
Private Const WM_CHAR As Long = &H102
Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE As Long = &H1
Private Const PM_NOYIELD As Long = &H2

'Check for a key press
Public Function CheckKeyboardBuffer() As String

'Dimension variables
Dim msgMessage As MSG
Dim hWnd As Long
Dim lResult As Long

'Get the window handle of this application
hWnd = ApphWnd

'See if there are any "Key down" messages
lResult = PeekMessage(msgMessage, hWnd, WM_KEYDOWN, _
WM_KEYDOWN, PM_REMOVE + PM_NOYIELD)

'If so ...
If lResult <> 0 Then
'... translate the key-down code to a character code,
'which gets put back in the message queue as a WM_CHAR
'message ...
lResult = TranslateMessage(msgMessage)

'... and retrieve that WM_CHAR message
lResult = PeekMessage(msgMessage, hWnd, WM_CHAR, _
WM_CHAR, PM_REMOVE + PM_NOYIELD)

'Return the character of the key pressed,
'ignoring shift and control characters
CheckKeyboardBuffer = Chr$(msgMessage.wParam)
End If

End Function

Traduction globale du commentaire :
Quand nous appuyons sur une touche sur le clavier, la fenêtre active est envoyée à un message de WM_keydown, avec un code de bas niveau pour identifier la clef physique serrée. La première chose que nous devons faire, alors, est d'employer PeekMessage pour regarder dans la file d'attente de message pour voir s'il y a des messages en suspens de WM_keydown, l'enlevant de la file d'attente si nous trouvons un. Si nous trouvions un, nous devons le traduire en code de caractère en utilisant TranslateMessage, de nouveau au lequel envoie le message traduit ont excelé la file d'attente de message comme message de WM_char. Nous alors regardons dans la file d'attente de message pour ce message de WM_char et renvoyons le caractère serré.
0
youkizouki Messages postés 82 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 12 octobre 2005 1
30 sept. 2005 à 21:24
Bonjour STEPH_3D,

désolé de répondre seulement maintenant a ton message, mais il y a des semaines que je n'ai pas lu mes mails perso

Je ne travail plus sur ce projet actuellement mais merci quand meme pour l'info...

si tu as besoin, j'essaierais de répondre à tes questions.

bonne soirée,

youki
0
Rejoignez-nous