[API32] SendMessage entre deux contrôles
Résolu
Utilisateur anonyme
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
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.
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.
A voir également:
- [API32] SendMessage entre deux contrôles
- Nombre de jours entre deux dates excel - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Itinéraire google map entre deux adresses - Guide
- Deux whatsapp sur un téléphone - Guide
9 réponses
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.
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.
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.
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.
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
}
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
}
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ;-)
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta?redirectedfrom=MSDN
(Bon reflexe OllyDbg ;-)
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 :)
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 :)
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 !
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 !