Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Difficulté d'utilisation de SendMessage() en C#

4 réponses
Avatar
Xavier
Bonjour,

Je d=E9veloppe actuellement un logiciel en C#, qui interagit avec une
application Windows via la fonction Win32 SendMessage()

Or je suis confront=E9 =E0 plusieurs soucis, notamment au niveau du
passage des param=E8tres.

J'ai d=E9clar=E9 la fonction comme ceci :

DllImport("user32.dll",CharSet =3D CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
IntPtr wParam,
IntPtr lParam);

Or, en fonction de la valeur pass=E9e =E0 wParam, le type de retour
change. Et dans mon cas pr=E9cis, j'ai un souci car je transmets une
valeur =E0 wParam et SendMessage est sens=E9e me renvoyer un char*.
J'ai essay=E9 en mode unsafe de caster le retour de SendMessage (char
*str =3D (char *)SendMessage(...) ), mais =E7a ne fonctionne pas.

Comment r=E9cup=E9rer la chaine renvoy=E9e, et l'affecter =E0 un
StringBuilder par exemple ?

Merci par avance pour votre aide

4 réponses

Avatar
Zoury
Salut Xavier !

Quels messages souhaites-tu envoyer ?


Or, en fonction de la valeur passée à wParam, le type de retour
change.



Rien ne t'empêche de définir la fonction avec des signatures différentes
afin de répondre à tes besoins le plus simplement du monde. Alors ce ne sera
pas un problème. :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
badubo
Salut,

Es tu sur que ce que tu veux faire est possible?
Le sendmessage a comme type de retour un entier. Effectivement on peut
mettre ce que l'on veut dans cet entier (entre autre un pointeur sur une
chaine) mais ca ne reste valable que pour le process qui traite le message.

Dans ton cas, le sendmessage envoit un pointeur sur une chaine de caractere
de SON espace memoire, ca ne correspond donc a rien dans l'espace memoire de
ton appli. Tu ne peux donc pas recuperer les infos.



"Xavier" wrote in message
news:
Bonjour,

Je développe actuellement un logiciel en C#, qui interagit avec une
application Windows via la fonction Win32 SendMessage()

Or je suis confronté à plusieurs soucis, notamment au niveau du
passage des paramètres.

J'ai déclaré la fonction comme ceci :

DllImport("user32.dll",CharSet = CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
IntPtr wParam,
IntPtr lParam);

Or, en fonction de la valeur passée à wParam, le type de retour
change. Et dans mon cas précis, j'ai un souci car je transmets une
valeur à wParam et SendMessage est sensée me renvoyer un char*.
J'ai essayé en mode unsafe de caster le retour de SendMessage (char
*str = (char *)SendMessage(...) ), mais ça ne fonctionne pas.

Comment récupérer la chaine renvoyée, et l'affecter à un
StringBuilder par exemple ?

Merci par avance pour votre aide
Avatar
Zoury
Salut Babudo ! :O)

Es tu sur que ce que tu veux faire est possible?



C'est très possible.. ;O)


Le sendmessage a comme type de retour un entier. Effectivement on peut
mettre ce que l'on veut dans cet entier (entre autre un pointeur sur une
chaine)



En fait, l'entier retourner par SendMessage est un type LRESULT qui est
*généralement* employé pour désigner le succès ou l'erreur survenue lors de
l'appel de la fonction. Les valeurs pouvant être retournées varient d'un
message à l'autre. De manière générale, les chaines de caractères devant
être retournées, le sont via le paramètre LParam.


mais ca ne reste valable que pour le process qui traite le message.
Dans ton cas, le sendmessage envoit un pointeur sur une chaine de


caractere
de SON espace memoire, ca ne correspond donc a rien dans l'espace memoire


de
ton appli. Tu ne peux donc pas recuperer les infos.



Nope. C'est Windows qui gère les messages et s'occupe de transmettre les
valeurs d'une fenêtre à l'autre que ce soit dans un même processus ou non.
Il est donc possible d'obtenir, par exemple, le texte d'un TextBox situé
dans la fenêtre dans une autre application car c'est Windows qui fait le
pont entre les deux.

Pour plus d'informations, je te suggère le lien suivant, qui explique en
détail le fonctionnement des messages et des queues de messages sous Windows
:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/aboutmessagesandmessagequeues.asp

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Paul Bacelar
badubo a raison car les Windows ne fait pas le mapping mémoire
inter-processus.

L'exemple fournit par Yanick n'est qu'un horrible hack fait par les
développeurs des OS pour contourner des problèmes de compatibilité entre
Win16 et Win32.

C'est une exception qui date des temps les plus reculés et pas le cas
général.
--
Paul Bacelar


"Zoury" <yanick_lefebvre at hotmail dot com> wrote in message
news:
Salut Babudo ! :O)

> Es tu sur que ce que tu veux faire est possible?

C'est très possible.. ;O)


> Le sendmessage a comme type de retour un entier. Effectivement on peut
> mettre ce que l'on veut dans cet entier (entre autre un pointeur sur une
> chaine)

En fait, l'entier retourner par SendMessage est un type LRESULT qui est
*généralement* employé pour désigner le succès ou l'erreur survenue lors


de
l'appel de la fonction. Les valeurs pouvant être retournées varient d'un
message à l'autre. De manière générale, les chaines de caractères devant
être retournées, le sont via le paramètre LParam.


> mais ca ne reste valable que pour le process qui traite le message.
> Dans ton cas, le sendmessage envoit un pointeur sur une chaine de
caractere
> de SON espace memoire, ca ne correspond donc a rien dans l'espace


memoire
de
> ton appli. Tu ne peux donc pas recuperer les infos.

Nope. C'est Windows qui gère les messages et s'occupe de transmettre les
valeurs d'une fenêtre à l'autre que ce soit dans un même processus ou non.
Il est donc possible d'obtenir, par exemple, le texte d'un TextBox situé
dans la fenêtre dans une autre application car c'est Windows qui fait le
pont entre les deux.

Pour plus d'informations, je te suggère le lien suivant, qui explique en
détail le fonctionnement des messages et des queues de messages sous


Windows
:



http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/aboutmessagesandmessagequeues.asp

--
Cordialement
Yanick
MVP pour Visual Basic