Send Message Shift+Enter [Résolu]

Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
- - Dernière réponse : supermotaboy
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
- 5 déc. 2005 à 21:57
Salut,

Je souhaite envoyer a un control d'un autre programme la combinaison Shift+Enter, le probleme est que quand je fais
PostMessage 132670, WM_KEYDOWN, VK_SHIFT, 0
PostMessage 132670, WM_KEYDOWN, VK_RETURN, 0
PostMessage 132670, WM_KEYUP, VK_RETURN, 0
PostMessage 132670, WM_KEYUP, VK_SHIFT, 0
(136270 est le handle du control, comme je ne sais pas encore comment faire pour le récupérer, je l'ai obtenu via un autre programme), ça a le meme effet que
PostMessage 132670, WM_KEYDOWN, VK_RETURN, 0
PostMessage 132670, WM_KEYUP, VK_RETURN, 0
J'ai beau cherché partout (y compris sur msdn), je ne vois pas comment faire. J'ai observer les messages reçu par le controle quand je fais cette action au clavier, et ils sont identiques a mon premier code, donc je ne vois pas ce qui ne va pas!!

LTourist
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
3
Merci
La solution a finalement été trouvée (ça fait un moment en fait mais je me suis dit qu'en faire profiter les autres serait une bonne chose) :). Une des techniques essayée était la bonne, seulement le probleme était que le code était trop "rapide" en quelque sorte, vous allez comprendre :

'keybd_event permet de simuler des evenements clavier, mais en général, c'est a dire qu'on ne peut pas envoyé cette evenment a un controle en particulier
Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
'GetAsyncKeyState permet elle de savoir si une touche du clavier est enfoncée ou non
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
'Pour envoyer des messages a des controles ou applications precis
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'On simule l'appui sur la touche Shift
keybd_event VK_SHIFT, 0, 0, 0
' tant que cette touche n 'est pas enfoncée, on ne passe pas a la suite (pour eviter le probleme du code trop "rapide" et que juste Entrée soit envoyé, et pas Shift+Entrée)
Do Until GetAsyncKeyState(VK_SHIFT) = -32767
DoEvents
Loop
'On envoie la pression de la touche entrée au controle concernée (j'utilise PostMesage car ce controle ne reagit pas avec SendMessage)
PostMessage TreeHwnd, WM_KEYDOWN, VK_RETURN, 0
'Comme PostMessage redonne la main immédiatement apres son execution, on laisse un peu de temps pour que celui-ci fasse "effet" (sisi, jvous jure que ça change 'qqch)
Sleep 100
'On envoie le message pour "relever" la touche entrée
PostMessage TreeHwnd, WM_KEYUP, VK_RETURN, 0
Sleep 100
'Idem mais en général pour Shift
keybd_event VK_SHIFT, 0, 2, 0
'De cette façon, et pour résumer : Shift est actif pour tout windows, mais Entrée est envoyé juste au controle souhaité, donc Shift+Entrée ne prend effet que sur lui! :D

NB : Pour y voir plus clair, copiez-collez ce code dans une feuille, je n'arrive pas a trouver comment faire de la coloration synthaxique désolé
LTourist

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 146 internautes nous ont dit merci ce mois-ci

Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
salut.
bah Post ou Send, çà fonctionne chez moi....
[VB6] 2 boutons 1 txtbox


Option Explicit
'
'
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
'
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
'
Private Const VK_SHIFT = &H10
Private Const VK_RETURN = &HD
'
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
'
'
Private Sub Command1_Click()
PostMessage Text1.hwnd, WM_KEYDOWN, VK_SHIFT Or VK_RETURN, 0&
PostMessage Text1.hwnd, WM_KEYUP, VK_SHIFT Or VK_RETURN, 0&
End Sub
'
'
Private Sub Command2_Click()
SendMessage Text1.hwnd, WM_KEYDOWN, VK_SHIFT Or VK_RETURN, 0&
SendMessage Text1.hwnd, WM_KEYUP, VK_SHIFT Or VK_RETURN, 0&
End Sub
'
'
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If (KeyCode Or Shift) = 29 Then MsgBox "Shift + Entrée", 32
End Sub


<SMALL> Coloration syntaxique automatique [AFCK]</SMALL>


ps : prochaine fois, donne les constantes et déclarations, çà fait gagner du temps à tout le monde ;)
PCPT [AFCK]
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
Désolé :)

Alors j'ai testé avec ton exemple et la plus d'effet du tout, j'ai juste modifié le handle pour qu'il corresponde au controle sur lequel je souhaite intervenir. En espionnant le message envoyé, le code de la touche est 0 ??? Par contre en espionnant le code de la touche envoyé au textbox, la c'est VK_NONCONVERT (29). C'est ce que tu as mis mais j'ai plus l'impression que c'est une sorte de constante d'erreur non?
En fin c'est bizarre que le code envoyé change entre si je l'envoie au textbox ou a mon controle, un lien avec le fait qu'il s'agit d'un autre probleme peut etre???

LTourist
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
J'ai trouvé quelqu'un qui avait sensiblement le meme probleme que moi, mais il n'as pas dis si il l'avait résolu. Un autre utilisateur lui propose d'aller voir sur MSDN MapVirtualKey ( la fonction n'est pas dans api guide, mais dans win32api.txt oui) et OEMKeyScan. Je suis aller voir mais je ne comprends pas grand chose, si quelqu'un pouvait aller voir et m'expliquer si a peut m'aider et si oui comment???
[URL]http://www.yaronet.com/posts.php?s=63417/URL

LTourist
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
salut,
bah ce qui est encore plus bizarre, c'est qu'en recopiant le code dans une nouvelle Form, la manipulation manuelle (shift enter) ne déclanche plus le MsgBox.

cela dit, mon PC n'est pas des plus fiables....
29 est le code que j'avais en le faisant manuellement. donc le vrai code de combinaison renvoyé par la TxtBox.
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
bah dans ce cas (suite au lien), une piste de recherche serait :

'-> retourne le statue de la touche spécifiée
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
'
'-> retourne les bits de poids faible
Private Declare Function loword Lib "TLBINF32" (ByVal DWord As Long) As Integer
'
'-> retourne les bits de poids fort
Private Declare Function hiword Lib "TLBINF32" (ByVal DWord As Long) As Integer

PCPT [AFCK]
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
est ce que tu pourrais expliquer les bits de poids faible et point fort, je connais de nom mais c'est tout.Pourquoi voudrais tu utilisé GetKeyState, celui ci renvoie les touches enfoncés, mais une seule a la fois, pas de combinaison???

LTourist
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
je viens de voir une idée interessant mais malheureusement ça ne marche pas:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte,ByVal bScan As Byte,ByVal dwFlags As Long,ByVal dwExtraInfo As Long)

Public Const KEYEVENTF_KEYUP = 2

keybd_event(VK_SHIFT,0,0,0);
SendMessage(hMediaPlayer,WM_CHAR,VK_RETURN,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
(j'ai remis en VB hein). L'idée du concepteur vient du fait qu'avec sendmessage on ne peut pas faire de raccourcis complexe, comme je le cherhe.
Son truc est donc de melanger les deux fonctions. J'ai aussi essayé avec keydown et up, aucun effet...
Source : http://tcharles.developpez.com/simul/

LTourist
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
Désolé pour le doublon, mais lien direct vers la partie concernée : http://tcharles.developpez.com/simul/#pbciblage

LTourist
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
re,
LParam contient la combinaison des touches
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
pour l'exemple au dessus non justement, on peut pas envoyé de combinaison complexe avec send ou postmessage apparement, son idée était de simuler shift enfoncé, et ensuite d'envoyé la touche entrée, simulant en fait le shift+enter. donc lparam contient juste VK_RETURN non? (je peux me tromper hein ^^) Sinon sur msdn, ya la fonction TranslateAccelerator qui semble interressante : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrfTranslateAccelerator.asp
les keyboardaccelerator, c'est des raccourcis, mais le probleme c'est que je ne vois pas du tout comment utilisé cette fonction!

LTourist
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
et un bon vieux SendKeys?
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
bah sendkeys ça marche pas pour une application externe non? en plus il faut l'envoyer a un controle et pas a une fenetre donc si sendkeys marche en mettant la fenetre au premier plan, je vois pas comment faire pour que les touches agissent sur ce controle et pas un autre.

LTourist
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
Le sendKeys ne marche pas :( En plus c'est la derniere difficulté dans mon prog, le reste c'est relativement facile, ça me saoule.Et en meme temps, sans ça je doute de pouvoir le finir, c'est assez essentiel comme truc!

LTourist
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
je ne vois pas le problème avec SendKeys (mis à part que c'est une solution que je n'aime pas trop).
par contre, il faut d'abord donner le focus à cette zone. et comme tu as le handle, un SetForegroundWindows ira sans mal.
suivi d'un DoEvents pour laisser l'affichage, et enfin le sendkeys de ta combinaison...
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
bah pour tester, j'avais fait un timer qui au bout de 5 sec executer le sendkeys, ça me laissait le temps de donner le focus au controle, juste pour tester, je vias retenter, merci

LTourist
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
non bah ça marche pas...

LTourist
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
20
0
Merci
slt,

beh c'est gentil de ta part.

le code n'est bien sûr pas testable directement puisque les déclarations sont d'un module, qu'il manque les constantes, etc...

et pour la coloration, c'est normal, c'est chez moi^^



je reste septique quand même, un tel déploiement juste pour 2 touches... j'suis perplexe.

++

[AFCK]
Messages postés
65
Date d'inscription
mercredi 26 février 2003
Statut
Membre
Dernière intervention
14 décembre 2005
0
Merci
Pardon pour les constantes je les ais oublier. Sinon tu as beau etre sceptique, c'est la seule solution existante apparement si on veut envoyer ce type de combinaison a un controle precis ou appli en connaissant son Handle. Sinon on peut tres bien juste utilisé keyb_event pour Shift et Entrée, mais dans ce cas, il faut faire un SetForegroungWindow (je sais plus le nom exact dsl) avant pour etre sur que c'est bien le controle qui t'intéresse qui recoivent les touches, et dans ce cas si l'utilisateur intervient entre les deux, c'est foutu!! ;) C'est la seule solution qui fonctionne (tu peux me croire, j'ai cherché sur internet pendant des heures, et c'est la seule que j'ai trouvé, elle vient de developpez.net (sur un cours sur du C++).
++, et merci de m'avoir aidé pendant tout le long

LTourist