[API32] SendMessage entre deux contrôles
Résolu/Fermé
Utilisateur anonyme
-
17 janv. 2008 à 23:14
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 24 janv. 2008 à 20:49
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 24 janv. 2008 à 20:49
A voir également:
- [API32] SendMessage entre deux contrôles
- Nombre de jours entre deux dates excel - Guide
- Itinéraire google map entre deux adresses - Guide
- Deux ecran pc - Guide
- Faire deux colonnes sur word - Guide
- Deux whatsapp sur un téléphone - Guide
9 réponses
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
17 janv. 2008 à 23:54
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.
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.
Utilisateur anonyme
18 janv. 2008 à 18:17
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.
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.
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
19 janv. 2008 à 13:53
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
}
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
}
Utilisateur anonyme
19 janv. 2008 à 21:48
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.
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
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
19 janv. 2008 à 22:01
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 ;-)
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta?redirectedfrom=MSDN
(Bon reflexe OllyDbg ;-)
Utilisateur anonyme
19 janv. 2008 à 22:42
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 :)
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 :)
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
19 janv. 2008 à 22:57
19 janv. 2008 à 22:57
Aah ok, c'est bon à savoir... :-)
Utilisateur anonyme
24 janv. 2008 à 20:14
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 !
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 !
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
24 janv. 2008 à 20:49
24 janv. 2008 à 20:49
Ah merci pour l'info!