Send Message Shift+Enter

Résolu
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005 - 2 nov. 2005 à 14:50
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

19 réponses

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 à 20:28
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
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 15:42
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]
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 15:53
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
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 16:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 16:05
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 16:42
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]
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 17:29
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
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 18:05
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
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 18:06
Désolé pour le doublon, mais lien direct vers la partie concernée : http://tcharles.developpez.com/simul/#pbciblage

LTourist
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 18:18
re,
LParam contient la combinaison des touches
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 18:29
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 18:45
et un bon vieux SendKeys?
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 19:07
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
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 19:13
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 nov. 2005 à 19:27
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...
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 19:32
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
0
supermotaboy Messages postés 65 Date d'inscription mercredi 26 février 2003 Statut Membre Dernière intervention 14 décembre 2005
2 nov. 2005 à 19:57
non bah ça marche pas...

LTourist
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 déc. 2005 à 20:54
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]
0
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
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
0
Rejoignez-nous