Pb avec SendMessage()

Signaler
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Hello, voilà mon problème... depuis ma DlgProc() j'envoi un message avec la fonction SendMessage() comme ci :

SendMessage(hWindow,IDC_MESSAGE,(WPARAM)pointeur,O);

où hWindow est le handle (déclaré en global) de la fenêtre parent et pointeur un pointeur que je veux envoyé...

Le prob c'est que la proc de la fenêtre parent ne recoit pas le message.

J'ai essayé avec PostMessage()... idem

J'ai essayé de mettre NULL en premier param.... idem

J'ai placer le message dans la DlgProc et envoi le message avec le premier param de la DlgProc... idem



Je n'ai plus d'idée... aidez-moi svp

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite

24 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Si IDC_MESSAGE est un message perso, mets le au moins (WM_USER+1)
dans recevant:
switch(message) {
case IDC_MESSAGE:
// ton code ici et devrait aller

par contre en wParam un pointeur, c'est pas courant ton affaire, il pointe sur quoi ??? Il y a séparation total des espaces mémoire, ton pointeur sera invalide si la fenêtre cible est dans un autre processus.

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Salut,

Il faut déclarer ton message comme ceci par exemple:

#define IDC_MESSAGE1 WM_USER

#define IDC_MESSAGE2 WM_USER+1



Je sais pas si tu l'as fait ou non.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
BruNews comme d'habitude, le plus rapide :)



Il a dit qu'il veut envoyer le message à la fenêtre parente, donc c'est
le même processus. Donc le pointeur passera sans problème.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ah oui j'ai sauté le mot parent.

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
12
Pour éviter l'emploi d'une variable globale tu peux faire:

SendMessage(GetParent(hDlg),IDC_MESSAGE,(WPARAM)pointeur,O);

hDlg est le HWND de la boite de dialogue.
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
merci à tous de prêter attention à mon post.

BruNews ->

- Comment je fais pour envoyer un pointeur (qui pointe sur une classe) ?

- Si je fais un autre exe pour lire ce qu'il y a dans la
classe comment je fais pour lui envoyer ou pour que l'exe soit lancer
dans le même processus ?



Sinon j'ai essayé d'envoyé un message qui fonction mais sans succès, donc j'en déduit que ça ne viens pas du message...

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
on n'envoie pas de pointeur sur les données d'un processus vers un autre processus, c'est définitif. Un processus vit dans un espace de mémoire virtuelle allouée par le système, ton pointeur arrivant dans l'autre processus viserait l'adresse dans la mémoire du processus cible, serait donc totalement invalide et gros risque de plantage.
Faut copier tes données dans un filemapping et discuter ainsi avec l'autre processus.

Si c'est dans le même processus alors tu passes 'this' de la classe.
Ceci dit je ne suis pas très classieux, alors...

ciao...
BruNews, MVP VC++
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
juste avant SendMessage(), j'ai fait quelque test.

hDlg est le handle de la boite de dialogue

hWindow est le handle de la fenêtre mère qui affiche la boite de dialogue

hDlg et hWindow ne vallent pas NULL, par contre GetParent(hDlg) == NULL

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
elle est comment ta ligne DialogBoxParam ???

ciao...
BruNews, MVP VC++
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Je pense que tu parlais de ça :

hDlgAdd = CreateDialog(hInst,(LPCTSTR)IDD_DIALOG_ADD,hWindow,(DLGPROC)DlgProc);

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
GetAncestor(hWnd, GA_PARENT); peut être
Je saisis mal la distinction parent/owner (MSDN aussi: "The GetParent function retrieves a handle to the specified window's parent or owner.[...]Note that, despite its name, this function can return an owner window instead of a parent window", c'est parent ou owner, mais on sait pas exactement lequel...)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
BruNews> Plutot que filemapping, WriteProcessMemory/ReadProcessMemory te semble pas aussi simple à gérer?
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Apparement, tout les SendMessage() et PostMessage() qui sont dans MainProc() et DlgProc() ne fonctionne pas....

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
bizzare ton affaire de GetParent() qui va bon d'hab, devrait aller. Essaie comme dit vecchio mais je doute que aille mieux.

WriteProcessMemory() sur quoi ? si processus exetrne, faudrait pouvoir déterminer à quelle adresse, une vraie galère. Le filemapping est très simple d'emploi une fois la combine comprise. On écrit les données et quand c'est prêt on PostMessage à l'autre que c'est dispo pour lecture, re PostMessage dans l'autre sens pour indiquer mission accomplie, etc...

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pour voir:
execute http://vecchio56.free.fr/SndMsg.exe
Puis dans ton prog:
SendMessage(FindWindow("SndMsg", 0), WM_USER+1, 0, 0);
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
if( hWindow != NULL) SendMessage(hWindow,MESSAGE...);

else MessageBox(...);

le messagebox ne s'affiche pas... le MESSAGE n'est pas traité.

une solution ?


Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
On ouvre le process avec GetWindowThreadProcessId comme on connait la fenêtre.
J'ai un peu de mal avec le filemapping (j'ai pas compris la combine quoi)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Si SendMessage retourne 0, ca veut pas dire que le message n'est pas envoyé! Met plutot une messageBox à la récéption pour tester s'il est recu (ce que fait mon prog plus haut)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pardon, je dis n'importe quoi... mais toi aussi non? J'ai pas trop compris ton dernier message
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Justement j'ai mis un MsgBox sur le message qui doit être envoyé... mais il ne s'affiche pas

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite