Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010
-
27 juil. 2010 à 18:27
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDerniè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 ?
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDerniè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... :(
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDerniè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...
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDerniè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