SENDKEYSEX => SIMULER UNE TOUCHE DANS UNE FENETRE PRÉCISE
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
27 mars 2007 à 18:08
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011
-
30 sept. 2011 à 13:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 30 sept. 2011 à 13:38
Bonjour
Merci pour ce code qui marche tres bien.Je n'y connais pas grand chose et je n'arrive pas à simuler des combinaisons de touches comme ALT(menu)+F, ou comme les touches de fonctions etles autres touches speciales(MAJ,CAPSLOCK,TAB,SHIFT.
Merci si tu as une solution
PTARD
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 16 nov. 2010 à 10:20
pas utile de piloter au clavier...
Excel est pilotable via COM
moussafir69
Messages postés3Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention25 décembre 2009 25 déc. 2009 à 22:45
Bonjour ,
Moi j'ai un probleme peut etre il sera pas compliquer a traiter par la fonction sendkey , je veux en effet piloter le menu excel et celui d'une autre application par des alt + c en dans excel et alt + o dans l'autre application , car je dois copier des données d'excel et les placées dans les champs de saisie de l'application .c'est opération répétitive que je placerai dans une boucle aprés .
Si quelqu'un peut m'aider , je serai reconnaissant .
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 mars 2009 à 07:34
utilises System.Windows.Forms.Keys
GrandByblos
Messages postés2Date d'inscriptionmercredi 27 décembre 2000StatutMembreDernière intervention18 novembre 2010 9 mars 2009 à 14:27
Bonjour.
Je me permets deux petites questions :
- Comment intégrer cette procédure à un projet VB.NET 2008 ?
En effet, il ne comprend pas le VBRUN.KeyCodeConstants (et je sèche un peu, j'avoue ^_^).
- En fait, j'essaye d'envoyer des codes touches à une application tierce, dont je ne peux modifier le source.
A l'heure actuelle, j'arrive à lui envoyer des touches en lui donnant le focus (par OpenIcon et SetForegroundWindow) puis en lui envoyant les touches via SendWait.
C'est fonctionnel, sauf dans le cas où la session utilisateur est verrouillée (mon appli devant se lancer le soir, vers 23h, et devant être déployée, je n'ai pas la maitrise de l'état de la session) ; en effet, dans le cas d'une session verrouillée, je ne peux plus donner le focus (forcément me direz-vous) et donc ça ne fonctionne plus ...
Avec cette procédure, me sera-t-il possible d'envoyer des touches (F1, etc.) à une application qui n'est pas au 1er plan ?
Merci d'avance pour vos réponses !
Cordialement
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 23 déc. 2008 à 09:29
On modifie l'etat du clavier.
en placant un DoEvents (ou ici, un Sleep 1) on redonne rapidement la main au systeme.
Ce dernier va regarder la fenêtre qui détiens le focus du clavier, et l'avertir des modifications du clavier.
pour l'avertir, elle passe par la voie standard: elle lui transmets des messages qui seront stockés dans une file d'attente.
Ces messages seront ensuite traités par la cible, selon sa disponibilité, bien sur, mais dans l'ordre de la file. Pas de perte de touche, donc.
boudas
Messages postés13Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 8 octobre 2008 8 oct. 2008 à 17:46
bonjour,
une petite question, comment peut-on savoir que le logiciel a bien recu la touche ?
car pour l'instant, on en a aucune assurance (dans le bloc note, il ne prend pas forcément en compte la touche "maj") (je l'utilise pour écrire des lettres en majuscules par exemple.)
d'avance merci
cs_Titant
Messages postés103Date d'inscriptionmardi 2 juillet 2002StatutMembreDernière intervention21 juillet 2008 21 juil. 2008 à 01:56
Salut,
Moi j'ai juste une petite question.
Comment on peu faire pour envoyer le textbox directement.
cad pas lettre par lettre mais un mot directement ?
Merci
pochagnole
Messages postés4Date d'inscriptionmercredi 4 avril 2007StatutMembreDernière intervention20 décembre 2007 20 déc. 2007 à 14:28
Merci beaucoup pour ces info. Je n'avais pas compris la différence entre VB.NET, VB6 et VBA.
Je vais m'en remettre au forum !
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 20 déc. 2007 à 12:18
VB.NET (VB 2005) est un autre langage très différent..
tu veux convertir ce code en VBA : il vaut mieux poser la question sur le forum et mettre le lien vers la source..
Bonne chance :)
ciberrique
Messages postés589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 20 déc. 2007 à 12:12
Comme Chatbour l'a dis, c'est que sous vb6, pas de vbexpress ou autre.
pochagnole
Messages postés4Date d'inscriptionmercredi 4 avril 2007StatutMembreDernière intervention20 décembre 2007 20 déc. 2007 à 11:50
Ok. Mince alors. N'y a-t-il pas moyen de l'adapter en vba ?
Désolé, je n'y connais pas grand chose, je débute (à noter que j'ai essayé le même code sous VB express 2005 et que j'avais les mêmes problèmes...).
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 20 déc. 2007 à 10:43
Salut,
Ce code n'est pas du VBA : il ne fonctionne pas sous la suite Office, mais sur VB6..
pochagnole
Messages postés4Date d'inscriptionmercredi 4 avril 2007StatutMembreDernière intervention20 décembre 2007 20 déc. 2007 à 09:04
Bonjour tout le monde !
Moi j'ai un gros problème, je n'arrive pas à faire fonctionner cette source sous access 2000.
Il me renvoie une erreur à cette ligne : "Public Sub SendKeysEx(ByVal vhTargetWnd As Long, ByVal veKey As VBRUN.KeyCodeConstants, Optional ByVal veShift As VBRUN.ShiftConstants, Optional ByVal vbExtendedKey As Boolean = False)"
Apparemment, il ne connaît pas VBRUN. Il me dit "Type défini par l'utilisateur non défini".
Dans les références, je n'ai pas "visual basic runtime objects and procedures". Est-ce que le problème peut venir de là. Si oui, comment faire pour avoir cette référence : quand je veux ajouter vb6fr.dll, j'ai une erreur... Déjà que j'ai dû rajouter VB6.OLB car je ne l'avais pas sur mon PC (pourtant j'ai installé les runtime vb6).
Aidez-moi, please !
MERCI !!!
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 déc. 2007 à 12:27
Ctrl+C/V ?
SendMessage WM_COPY et WM_PASTE ne convient pas ?
pulpul74
Messages postés77Date d'inscriptionjeudi 11 octobre 2007StatutMembreDernière intervention27 septembre 2010 3 déc. 2007 à 10:05
Source très sympa, très utile, par contre je trouve domage que certaines combinaisons de touches ne marchent pas forcement, comme par exemple un ctrl-C et ctrl-V.Mais bon déja ca peut etre pas mal dans certaines situation, merci!
phixfoxphixfox
Messages postés2Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention25 octobre 2007 25 oct. 2007 à 14:35
Merci bcp pour ce code !!
mais je dois me faire des noeud au cerveau en se moment car je n'arrive pas a faire ce que je veux
donc sendkeysex(handle,codetouche,....) te permet d'envoyer un caractere dans une appli externe
c'est genial
mais d'apres ce que je comprends ce caractere est codé donc 49 permet d'envoyer un "1" etc
j'aimerai pouvoir envoyer une chaine de caractere de ce type directement
"12*45={entrée}Merci{ctrl}A{ctrl}C"
par une fonction du genre :
sendstringex(handle,"12*45={entrée}Merci{ctrl}A{ctrl}C" )
pourrai tu m'aider , car je boucle lamentablement sur ce pb
Merci par avance
Chatbour
Messages postés71Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention12 juillet 200910 7 sept. 2007 à 02:52
Bonne source :)
j'ai une question : comment faire l'inverse, c'est à dire contrôler par exemple un TextBox depuis Notepad (j'ai une bonne imagination ;) )..
ciberrique
Messages postés589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 14 juin 2007 à 10:25
Merci, je connaissais pas !!!
Je vais plancher la dessus.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 14 juin 2007 à 04:41
Le Alt, je ne sais pas, comme ça, faut que je testes
Ctrl + Shift + Z... je dirai :
SendKeysEx xxx, vbKeyZ, vbShiftMask Or vbCtrlMask
je regarderai ca de plus pres
ceci dit, il y a BEAUCOUP plus simple pour faire ce que tu cherches a faire...
lances Spy++ et Photoshop
espionne ta fenetre
cliques dans ton menu.
et recherches dans SPY++ le message WM_COMMAND correspondant.
lParam et wParam te renverront les précieux parametres qu'il te suffira de retransmettre via un SendMessage pour faire executer ta commande. Tu sera independant des raccourcis clavier, etc... et en plus, ce sera plus rapide ^^
pas clair ?
pas de soucis, redemande moi.... je reexpliquerai ^^
ciberrique
Messages postés589Date d'inscriptionlundi 25 août 2003StatutMembreDernière intervention18 juillet 20101 13 juin 2007 à 20:08
Le code fonctionne apparement, mais quand je veux utiliser la combinaison control + Z sous adobe photoshop alors la le resultat est considerer par adobe que comme un Z sans le Control.
Puis aussi comment faire la combinaison Control + Alt + Z ou Control + Shift + Z qui sont très important sous photoshop.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 19 mai 2007 à 19:08
tout dépend du jeu, et de la technologie qu'il utilise...
fort a parier qu'il s'agit de DirectInput, qui traite directement avec le matériel, sans demander quoi que ce soit à Windows....
Uvatha
Messages postés34Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention17 mai 2007 17 mai 2007 à 20:05
J'aurais une petite question...
J'ai essayé ta source Renfield et elle fonctionne très bien... seulement, je voulais simuler des touches dans un jeu et pour une raison inconnue, ça ne fonctionne pas, ça ne passe même pas le
If IsWindow(vhTargetWnd) Then
Je ne connais pas trop bien l'API IsWindow mais je suppose que ça ne fonctionne tout simplement pas pour un jeu.
Si quelqu'un a une solution à ce problème, merci de bien vouloir m'en faire part.
9/10 pour la source, très claire et assez bien commentée.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 mars 2007 à 14:34
pas tout a fait pareil, en fait...
source très interessante...
ym_trainz surveille le clavier. si une sequence particuière de touches est detectée, il simule n pressions de touches au clavier, pour automatiser certaines choses.
ici, je simule la pression de touches a destination d'appli (de fenetres) n'ayant pas forcément le focus.
VBGenesis
Messages postés292Date d'inscriptionsamedi 25 février 2006StatutMembreDernière intervention22 février 2009 28 mars 2007 à 12:53
Je n'ai pas encore regardé la source (désolé) mais tu peux aller voire cette source de ym_trainz si tu veux :
http://www.vbfrance.com/code.aspx?ID=39754 Ca gère le sendkeys en fonction de la fenêtre active (récupération du titre de la fenêtre). Je crois que c'est comparable a ta propre source.
A+
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 mars 2007 à 10:47
je viens d'ajouter le parametre veShift , afin de pouvoir simuler des raccourcis clavier, comme Ctrl+S (dans l'exemple du zip)
hvb
Messages postés939Date d'inscriptionvendredi 25 octobre 2002StatutMembreDernière intervention27 janvier 20093 27 mars 2007 à 23:39
excellent! comme le nom de la source
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 27 mars 2007 à 18:08
keybd_event (ou SendInput)est pas mal également,
mais dans le cas présent, je simule une pression de touche sur une appli en fond, afin de lui dire "je suis là"...
donc je ne peux pas faire de SetFocus(après un AttachThreadInput) etc, sinon ca ait apparaitre la fenetre cible au dessus de ma fenetre courante, ca clignotte... pas top, quoi ^^
30 sept. 2011 à 13:38
Merci pour ce code qui marche tres bien.Je n'y connais pas grand chose et je n'arrive pas à simuler des combinaisons de touches comme ALT(menu)+F, ou comme les touches de fonctions etles autres touches speciales(MAJ,CAPSLOCK,TAB,SHIFT.
Merci si tu as une solution
PTARD
16 nov. 2010 à 10:20
Excel est pilotable via COM
25 déc. 2009 à 22:45
Moi j'ai un probleme peut etre il sera pas compliquer a traiter par la fonction sendkey , je veux en effet piloter le menu excel et celui d'une autre application par des alt + c en dans excel et alt + o dans l'autre application , car je dois copier des données d'excel et les placées dans les champs de saisie de l'application .c'est opération répétitive que je placerai dans une boucle aprés .
Si quelqu'un peut m'aider , je serai reconnaissant .
10 mars 2009 à 07:34
9 mars 2009 à 14:27
Je me permets deux petites questions :
- Comment intégrer cette procédure à un projet VB.NET 2008 ?
En effet, il ne comprend pas le VBRUN.KeyCodeConstants (et je sèche un peu, j'avoue ^_^).
- En fait, j'essaye d'envoyer des codes touches à une application tierce, dont je ne peux modifier le source.
A l'heure actuelle, j'arrive à lui envoyer des touches en lui donnant le focus (par OpenIcon et SetForegroundWindow) puis en lui envoyant les touches via SendWait.
C'est fonctionnel, sauf dans le cas où la session utilisateur est verrouillée (mon appli devant se lancer le soir, vers 23h, et devant être déployée, je n'ai pas la maitrise de l'état de la session) ; en effet, dans le cas d'une session verrouillée, je ne peux plus donner le focus (forcément me direz-vous) et donc ça ne fonctionne plus ...
Avec cette procédure, me sera-t-il possible d'envoyer des touches (F1, etc.) à une application qui n'est pas au 1er plan ?
Merci d'avance pour vos réponses !
Cordialement
23 déc. 2008 à 09:29
en placant un DoEvents (ou ici, un Sleep 1) on redonne rapidement la main au systeme.
Ce dernier va regarder la fenêtre qui détiens le focus du clavier, et l'avertir des modifications du clavier.
pour l'avertir, elle passe par la voie standard: elle lui transmets des messages qui seront stockés dans une file d'attente.
Ces messages seront ensuite traités par la cible, selon sa disponibilité, bien sur, mais dans l'ordre de la file. Pas de perte de touche, donc.
8 oct. 2008 à 17:46
une petite question, comment peut-on savoir que le logiciel a bien recu la touche ?
car pour l'instant, on en a aucune assurance (dans le bloc note, il ne prend pas forcément en compte la touche "maj") (je l'utilise pour écrire des lettres en majuscules par exemple.)
d'avance merci
21 juil. 2008 à 01:56
Moi j'ai juste une petite question.
Comment on peu faire pour envoyer le textbox directement.
cad pas lettre par lettre mais un mot directement ?
Merci
20 déc. 2007 à 14:28
Je vais m'en remettre au forum !
20 déc. 2007 à 12:18
tu veux convertir ce code en VBA : il vaut mieux poser la question sur le forum et mettre le lien vers la source..
Bonne chance :)
20 déc. 2007 à 12:12
20 déc. 2007 à 11:50
Désolé, je n'y connais pas grand chose, je débute (à noter que j'ai essayé le même code sous VB express 2005 et que j'avais les mêmes problèmes...).
20 déc. 2007 à 10:43
Ce code n'est pas du VBA : il ne fonctionne pas sous la suite Office, mais sur VB6..
20 déc. 2007 à 09:04
Moi j'ai un gros problème, je n'arrive pas à faire fonctionner cette source sous access 2000.
Il me renvoie une erreur à cette ligne : "Public Sub SendKeysEx(ByVal vhTargetWnd As Long, ByVal veKey As VBRUN.KeyCodeConstants, Optional ByVal veShift As VBRUN.ShiftConstants, Optional ByVal vbExtendedKey As Boolean = False)"
Apparemment, il ne connaît pas VBRUN. Il me dit "Type défini par l'utilisateur non défini".
Dans les références, je n'ai pas "visual basic runtime objects and procedures". Est-ce que le problème peut venir de là. Si oui, comment faire pour avoir cette référence : quand je veux ajouter vb6fr.dll, j'ai une erreur... Déjà que j'ai dû rajouter VB6.OLB car je ne l'avais pas sur mon PC (pourtant j'ai installé les runtime vb6).
Aidez-moi, please !
MERCI !!!
3 déc. 2007 à 12:27
SendMessage WM_COPY et WM_PASTE ne convient pas ?
3 déc. 2007 à 10:05
25 oct. 2007 à 14:35
mais je dois me faire des noeud au cerveau en se moment car je n'arrive pas a faire ce que je veux
donc sendkeysex(handle,codetouche,....) te permet d'envoyer un caractere dans une appli externe
c'est genial
mais d'apres ce que je comprends ce caractere est codé donc 49 permet d'envoyer un "1" etc
j'aimerai pouvoir envoyer une chaine de caractere de ce type directement
"12*45={entrée}Merci{ctrl}A{ctrl}C"
par une fonction du genre :
sendstringex(handle,"12*45={entrée}Merci{ctrl}A{ctrl}C" )
pourrai tu m'aider , car je boucle lamentablement sur ce pb
Merci par avance
7 sept. 2007 à 02:52
j'ai une question : comment faire l'inverse, c'est à dire contrôler par exemple un TextBox depuis Notepad (j'ai une bonne imagination ;) )..
14 juin 2007 à 10:25
Je vais plancher la dessus.
14 juin 2007 à 04:41
Ctrl + Shift + Z... je dirai :
SendKeysEx xxx, vbKeyZ, vbShiftMask Or vbCtrlMask
je regarderai ca de plus pres
ceci dit, il y a BEAUCOUP plus simple pour faire ce que tu cherches a faire...
lances Spy++ et Photoshop
espionne ta fenetre
cliques dans ton menu.
et recherches dans SPY++ le message WM_COMMAND correspondant.
lParam et wParam te renverront les précieux parametres qu'il te suffira de retransmettre via un SendMessage pour faire executer ta commande. Tu sera independant des raccourcis clavier, etc... et en plus, ce sera plus rapide ^^
pas clair ?
pas de soucis, redemande moi.... je reexpliquerai ^^
13 juin 2007 à 20:08
Puis aussi comment faire la combinaison Control + Alt + Z ou Control + Shift + Z qui sont très important sous photoshop.
19 mai 2007 à 19:08
fort a parier qu'il s'agit de DirectInput, qui traite directement avec le matériel, sans demander quoi que ce soit à Windows....
17 mai 2007 à 20:05
J'ai essayé ta source Renfield et elle fonctionne très bien... seulement, je voulais simuler des touches dans un jeu et pour une raison inconnue, ça ne fonctionne pas, ça ne passe même pas le
If IsWindow(vhTargetWnd) Then
Je ne connais pas trop bien l'API IsWindow mais je suppose que ça ne fonctionne tout simplement pas pour un jeu.
Si quelqu'un a une solution à ce problème, merci de bien vouloir m'en faire part.
9/10 pour la source, très claire et assez bien commentée.
28 mars 2007 à 14:34
source très interessante...
ym_trainz surveille le clavier. si une sequence particuière de touches est detectée, il simule n pressions de touches au clavier, pour automatiser certaines choses.
ici, je simule la pression de touches a destination d'appli (de fenetres) n'ayant pas forcément le focus.
28 mars 2007 à 12:53
http://www.vbfrance.com/code.aspx?ID=39754
Ca gère le sendkeys en fonction de la fenêtre active (récupération du titre de la fenêtre). Je crois que c'est comparable a ta propre source.
A+
28 mars 2007 à 10:47
27 mars 2007 à 23:39
27 mars 2007 à 18:08
mais dans le cas présent, je simule une pression de touche sur une appli en fond, afin de lui dire "je suis là"...
donc je ne peux pas faire de SetFocus(après un AttachThreadInput) etc, sinon ca ait apparaitre la fenetre cible au dessus de ma fenetre courante, ca clignotte... pas top, quoi ^^