Utilisation des API SendMessage/sendDlgItemMessage

Résolu
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010 - 27 juil. 2010 à 18:27
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010 - 28 juil. 2010 à 21:31
Bonjour,

Je souhaite modifier une zone de texte d'un logiciel via une macro Excel. Pour cela, j'ai utilisé WinSpector et j'ai vu qu'il fallait "dire" au logiciel de rafraichir ses données en envoyant les commandes EN_UPDATE et EN_CHANGE (sinon, il ne prend pas en compte la valeur envoyée):

WM_COMMAND
Code: EN_CHANGE
Control ID: 112
Control HWND: 0x000200bc

WM_COMMAND
Code: EN_UPDATE
Control ID: 112
Control HWND: 0x000200bc

Je voudrais envoyer ces 2 messages en utilisant soit sendMessage, soit SendDlgItemMessage, mais je ne sais pas vraiment quelle syntaxe utiliser...

Quelqu'un pourrait-il m'aider et m'indiquer l'instruction sendmessage ou senddlgitemmessage correspondante ?

Par ailleurs, connaitriez vous un bon tutorial sur l'utilisation de ce type d'API ?

Merci d'avance pour votre aide.

Simon

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 juil. 2010 à 18:48
Salut
En cherchant "vb6 sendmessage WM_COMMAND" sur un moteur de rechrche, on tombe sur des sources de vbfrance comme <celle-ci>
Il y a aussi les sites de référence en matière d'API comme <celui-ci> ou <celui-là>
Ou encore le logiciel gratuit http://logiciel.codes-sources.com/logiciels/API-Guide-197.aspx qui offre des exemples VB6.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010
27 juil. 2010 à 19:15
Bonjour Jack,

Merci pour ces liens (je ne les connaissais pas tous).

En fait, mon soucis, c'est que je n'arrive pas à envoyer la notification EN_CHANGE ou EN_UPDATE et à reproduire ce que me donne l'outil Spy WinSpector.

Quand on regarde EN_CHANGE ou En_UPDATE dans la MSDN, il est expliqué que "The parent window of the edit control receives this notification code through a WM_COMMAND message." Cela veut il dire qu'il faut combiner WM_COMMAND et EN_CHANGE dans la même ligne de commande ? Bref, si le handle de la fenêtre que j'uilise se nomme hwnd, que dois je écrire ?
SendMessage hWnd, WM_COMMAND, 112, EN_UPDATE ?
SendDlgItemMessage hWnd, 112, WM_COMMAND, EN_UPDATE, 0 ?

Bref, je débute tout juste dans ces API et je suis un peu (beaucoup) perdu et je ne sais pas comment écrire l'instruction, tout ce que je fait ne fonctionne pas... :(
0
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010
27 juil. 2010 à 22:17
Désolé, je viens de trouver l'explication dans la MSDN, et je n'avais pas tout compris.

En fait, dans...

"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

...il faut mettre la notification EN_CHANGE dans le LowWord du wParam et le Control ID dans le HighWord du wParam , ce qui donne:

Private Const EN_CHANGE As Long = &H300
Private Const EN_UPDATE As Long = &H400

Dim Control_ID As Long
Control_ID = 112
Dim Control_HWND As Long
Control_HWND = &H000200bc

SendMessage hWnd, WM_COMMAND, EN_UPDATE * &H10000 + Control_ID , ByVal Control_HWND
SendMessage hWnd, WM_COMMAND, EN_CHANGE * &H10000 + Control_ID , ByVal Control_HWND

Voila pour la syntaxe...
Ca ne me donne pas ce que je veux, mais au moins ça recrée bien les message vus dans Winspector.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 juil. 2010 à 09:06
Re

EN_UPDATE * &H10000 : Multiplié ? très très bizarre

Control_HWND : Un handle n'a jamais la même valeur d'un lancement de programme à un autre --> Il faut faire la recherche du Handle dynamiquement (voir FindWindowText par exemple)
0

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

Posez votre question
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010
28 juil. 2010 à 10:18
Bonjour Jack,

EN_UPDATE * &H10000 : ca me permet de décaler le code EN_UPDATE de 16 bits vers la gauche et de le placer en "position Highword" - par exemple: 8ACF * 10000 = 8ACF0000 - Je ne sais pas s'il existe une solution plus élégante...

Control_HWND: tout a fait d'accord avec toi, j'ai été un peu rapide dans l'écriture de la réponse - il faut bien sûr obtenir le handle dynamiquement (contrairement au ControlID qui est fixe) - c'est une bonne remarque, merci de l'avoir souligné

Je n'ai pas encore eu le temps de retravailler sur le code, mais je vais le faire dans la journée et voir si ca passe...
0
Chouchensb Messages postés 64 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 2 septembre 2010
28 juil. 2010 à 21:31
Dernier petit message pour dire que ça marche bien... J'ai galéré sur ces API, mais une fois bien compris, c'est rudement efficace.

Pour info, l'ensemble des messages et notifications de windows est disponible ici: MSDN. C'est bien utile !

Par ailleurs, la syntaxe est légèrement différente selon que l'on envoie un message ou une notification (chaque cas est documenté dans la MSDN, il faut aller y jeter un coup d'oeil). Par exemple, si l'on veut sélectionner le 6ème élément dans une combo box et faire prendre en compte la modification par le logiciel, il faudra utiliser les commandes suivantes:

'hWnd est le handle de la fenêtre trouvé à l'aide de fonctions telles que FindWindow ou GetWindow - c'est une valeur attribuée dynamiquement et donc nouvelle à chaque création de la fenêtre, comme l'a expliqué Jack dans le message ci-dessus
'CTRL_ID_ComboBox est le control ID de la combo box trouvée à l'aide d'un logiciel tel que Spy++ ou Winspector - c'est une constante générée à la compilation du logiciel

Private Const CB_SETCURSEL As Long = &H14E
Private Const CBN_SELCHANGE As Long = &H1
Private Const WM_COMMAND As Long = &H111

hComboBox = GetDlgItem(hWnd, CTRL_ID_ComboBox)
SendDlgItemMessage hWnd, CTRL_ID_ComboBox, CB_SETCURSEL, 5, ByVal &H0
SendMessage hWnd, WM_COMMAND, CBN_SELCHANGE * &H10000 + CTRL_ID_ComboBox, ByVal hComboBox

Voilou !
0
Rejoignez-nous