[API32] SendMessage entre deux contrôles

Résolu/Fermé
Utilisateur anonyme - 17 janv. 2008 à 23:14
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 24 janv. 2008 à 20:49
Bonjour,

voilà je débute en API32, alors j'étais en train de programmer des tests.

Je tente de copier ce qu'il y a dans un contrôle de type EDIT vers un autre contrôle du même type.

voici ce que j'ai mis dans le WM_CREATE et le WM_COMMAND :
-------------------------------------------------------------
case WM_CREATE:
CreateWindow("BUTTON", "Copy", WS_CHILD|WS_VISIBLE, 100, 100, 100, 25, hWnd, (HMENU)ID_COPY, instance, NULL);

input = CreateWindow("EDIT", "texte", WS_CHILD|WS_VISIBLE|WS_BORDER, 50, 25, 300, 20, hWnd, NULL, instance, NULL);

output = CreateWindow("EDIT", "", WS_CHILD|WS_VISIBLE|WS_BORDER, 50, 75, 300, 20, hWnd, NULL, instance, NULL);

return 0;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_COPY:
char contenu[50] = {0};
GetWindowText(input, contenu, 50);
SendMessage(output, EM_ADDSTRING, 0, (LPARAM)contenu);
break;
}
return 0;
-------------------------------------------------------------
Pour le GetWindowText ca marche sans problèmes.
Mais pour SendMessage je ne sais pas quoi mettre exactement et encore moins ce qui se passe ...

SVP, pouvez vous m'aider pour pouvoir copier le contenu d'un contrôle EDIT vers un autre?

D'avance merci.

9 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 janv. 2008 à 23:54
Il faudrait que tu utilises WM_USER comme message, ça te permet d'envoyer des messages privés.
Dans wParam tu mets ce que tu veux, à toi de codifier tes messages. Tu peux effectivement, le mettre à 0 pour préciser qu'il s'agit bien d'une chaine que tu envoies. Bref, c'est à toi de lui donner du sens.
Puis dans lparam, tu peux mettre le pointeur de ta chaine. En gros tu as quasiment tout bon ;-)
Il te reste à le récupérer dans le callback de l'autre fenêtre.
0
Utilisateur anonyme
18 janv. 2008 à 18:17
Je m'excuse, mais je n'arrive pas à comprendre exactement comment je dois coder WM_USER ...

Voici ce que j'ai mis :
----------------------------------------
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_COPY:
GetWindowText(input, contenu, 50);
break;
}
return 0;

case WM_USER:
SendMessage(output, CB_ADDSTRING, 0, (LPARAM)contenu);
break;
return 0;
---------------------------------------------
Mais c'est pratiquement le même problème (j'ai surement dû faire une faute mais où?).

Merci.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
19 janv. 2008 à 13:53
Tu l'envoies comme ça:

SendMessage(output, WM_USER, 0, (LPARAM) contenu);

Et dans l'autre wndproc tu le récupères comme ça:

case WM_USER:
if(wParam == 0){
//Ta chaîne est dans lParam
}
0
Utilisateur anonyme
19 janv. 2008 à 21:48
Merci.

Mais ça ne change pas grand chose !

Je me suis débrouillé pour voir ce qui cloche, alors avec OllyDBG, j'ai trouvé que le problème venait de GetWindowText.

Précision :
- Le push du buffer pour GetWindowText pointait vers une adresse dont les valeurs sont FF EF 6A 47 ... bref rien à avoir avec les caractères que j'ai écrits.
- Après que GetWindowtext fut executé, normalement EAX devrait valoir la longueur du texte, mais EAX prenait la valeur 0.


J'ai même fait un MessageBox après GetWindowText pour confirmer si contenu changeait ou non ...

Voici ce que j'ai mis :
-------------------------------------------------
GetWindowText (input, contenu, 50);
MessageBox ( hWnd, contenu, "info", MB_OK);
-------------------------------------------------

Mais MessageBox n'affichait rien ( ça prouve que le problème vient de GetWindowText ).

Alors je suis coincé et je ne comprend pas d'où vien l'erreur pas évidente .
Sinon il faut peut être que j'utilise GetDlgItemText à sa place .

Merci.
0

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

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
19 janv. 2008 à 22:01
Ah ben c'est GetDlgItemText pour récupérer le texte d'un contrôle edit, getwindowtext c'est pas la même chose:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta?redirectedfrom=MSDN

(Bon reflexe OllyDbg ;-)
0
Utilisateur anonyme
19 janv. 2008 à 22:42
C'est bon!

Finalement l'erreur avec GetWindowtext était dûe à la création du conrtôle :
-----------------
HWND input = CreateWindow("EDIT", "texte" ... );
-----------------

Pour que GetWindowText fasse son travail, il faut d'abord supprimer "texte" dans la fenêtre puis taper son nouveau texte (ou carément l'enlever du code source ^^ ).

Merci kilian, ce n'est pa la 1ere fois que tu m'aide :)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
19 janv. 2008 à 22:57
Aah ok, c'est bon à savoir... :-)
0
Utilisateur anonyme
24 janv. 2008 à 20:14
Bon voilà, après quelques jours je viens de me rendre compte que j'ai fait une grosse bétise lors de la déclaration des contrôles.

Voici ce que j'ai mis (faux):
------------------------------------
HWND input = 0;
------------------------------------

Alors qu'il fallait mettre:
------------------------------------
static HWND input = 0;
------------------------------------

Voilà pour l'erreur fatale ^^.

Et je viens aussi de trouver deux moyens plus facils pour envoyer du texte au contrôle, alors pourquoi ne pas les partager ^^ :

Soit on met :
------------------------------------
GetWindowText(input, contenu, 50);
SendMessage(output, WM_SETTEXT, 0, (LPARAM)contenu);
-----------------------------------

Sinon :
-----------------------------------
GetWindowText(input, contenu, 50);
SetWindowText(output, contenu);
-----------------------------------

C'est tout !
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
24 janv. 2008 à 20:49
Ah merci pour l'info!
0