ECHANGE DE MESSAGES WINDOWS ENTRE DEUX APPLICATIONS

cristiandan Messages postés 52 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 4 novembre 2005 - 11 mai 2004 à 09:34
totoalecole Messages postés 2 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 12 juillet 2010 - 12 juil. 2010 à 13:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22686-echange-de-messages-windows-entre-deux-applications

totoalecole Messages postés 2 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 12 juillet 2010
12 juil. 2010 à 13:12
Pb reglé en changeant comme indique plus haut le type long en integer (j'utilise visual basic 2010)
Par contre, lors de l'exécution de mon code, lorsque le receveur existe, j'ai le msg suivant :

Un appel à la fonction PInvoke 'MyFoxKey!WindowsApplication1.ModuleConnection::PostMessage' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

faut-il la aussi declare des integer ???????????
totoalecole Messages postés 2 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 12 juillet 2010
12 juil. 2010 à 12:37
pour une raison X ma fonction findwindows ne retourne jamais 0 meme lorsque la fenetre n'existe pas ??

dim Resultat_Find_Appli as long = 0
Resultat_Find_Appli = FindWindow(vbNullString, "nom_de_fenetre_inexistant")

quelqu'un saurait-il pourquoi ?
9112 Messages postés 24 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 8 septembre 2009
8 nov. 2008 à 13:16
Hum. Effectivement, cela pourrait améliorer le système d'automatismes de MultiBotSystem en utilisant des applications externes qui lui envoient des requêtes IRC à traiter :p J'avais mon idée pour MBS Remote control Server :p
Merci pour cette source :)
kakenette Messages postés 218 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 15 novembre 2009 1
30 janv. 2007 à 14:34
Pourquoi pas fair tout simplement une connexion local comme pratiquement toutes les applications travaillant en doubles processus... ? ( exemple : kaspersky anti-virus, kerio firewall)
cs_salazar Messages postés 241 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 19 février 2006 2
25 janv. 2006 à 23:01
Hello,

Il n'y a pas de déclaration entre les deux fenètres.
L'emetteur capte tous les messages par hooking, les analyses, puis les transmets uniquement à l'application qui porte un nom bien défini au moment de l'envoi. Le nom, est celui de l'appli qui recoit : Appli_receveur. Si une deuxième appli porte le meme nom, les deux recevront l'atom. Mais il faut que l'appli réceptrice sache le traiter et soit programmer pour capter les messages...
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
25 janv. 2006 à 21:11
mat_inter,
Je pense que c'est pas possible.
Les deux applis pour qu'elles communiquent on besoins de déclarations, comme dans l'exemple avec les variables WM_ENVOI_NUMERIQUE et WM_ENVOI_ATOM.
mat_inter Messages postés 7 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 26 janvier 2006
25 janv. 2006 à 18:44
Merci pour cette source très bien ecrite.
Comment peut-on envoyer du texte à une fenetre que l'on ne gère pas ?
Peut-etre avec un WM_KEYDOWN à la place du WM_ENVOI_ATOM ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 janv. 2006 à 19:17
sendkeys est à bannir sur système multi taches préemptif, on n'a jamais l'assurance de qui recevra les touches claviers.
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
13 janv. 2006 à 17:15
d'accord je comprends.

de toutes facons, les sendkeys sont assez contraignantes car elles obligent le recepteur à etre "en attente" d'entrees clavier.
Cependant pour une utilisation d'un recepteur sans interface utilisateur, ca peut s'envisager.
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
13 janv. 2006 à 16:54
oommeeggaa3d,
Tu peux utiliser les sendkeys, mais l'objectif de cette source, c'est de donner un exemple de communication entre 2 applications en utilisant les messages Windows.
a+
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
13 janv. 2006 à 16:45
Je ne sais pas si ca correspond a ce que vous voudriez faire, mais pourquoi ne pas utiliser les evenements deja existants ?
par exemple : l'evenement keyup coté recepteur, associé avec la commande sendkeys coté emetteur.
pour une appli où les entrées au clavier ne sont pas utilisées bien sur (ou alors il faut filtrer lorsque l'entree clavier provient de l'emetteur : en commencant le message par un caractere particulier par exemple)
Je ne sais pas si ca a un sens ce que je dis :-)
ppcdev Messages postés 3 Date d'inscription vendredi 5 juillet 2002 Statut Membre Dernière intervention 20 octobre 2005
13 oct. 2005 à 09:55
Autant pour moi, BruNews, je code en C# (et j'ai du faire la conversion VB.NET vers C#).

D'ailleurs j'ai un pb pour la conversion du code, au niveau de l'override de la fonction WndProc avec la commande AddressOf...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 oct. 2005 à 15:33
C'est VB6 ici donc pour un 32 bits c'est type 'Long'.
A part quelques exceptions comme GetKeyState(), quasi toute l'API win32 retourne du 32 bits, int ou long en C donc 'Long' en VB.
ppcdev Messages postés 3 Date d'inscription vendredi 5 juillet 2002 Statut Membre Dernière intervention 20 octobre 2005
11 oct. 2005 à 15:15
pourquoi tout est déclaré en LONG ???

pour moi j'ai du tout passer en INT !

La fonction FindWindow NE RENVOIT PAS DE LONG MAIS UN INT !!!

Non mais :)
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
26 janv. 2005 à 22:29
Salut salazar,
L'instruction Save_WndProc_Adresse SetWindowLong(.... dans Form_Load() sert uniquement a rediriger les messages Windows dans la procédure Capture_Message_Windows du module. Cela permet de remplace l'adresse de la routine Standard windows par celle de notre procedure> Capture_Message_Windows.
Donc a ce moment tous les messages windows sont interceptes dans cette procedure. Après on filtre les messages grace au Select Case via notre uMsg.
Si uMsg est pour nous alors on le traite si non on le laisse traiter par Windows via Capture_Message_Windows = CallWindowProc(.....
Je ne sais pas si je suis clair.

Parcontre il faut faire attention dans cette procedure, il n'est pas conseillé de mettre un point d'arrêt pour voir ce qui se passe car l'application risque fortement de se figé ou voir même de planter Windows. Cela s'explique que le flux de messages est en permanence en mouvement.
C'est comme une chute d'eau, on ne peut pas arrêter l'eau de la chute.
Tous les évenements du système d'exploitation, des logiciels, des gestions souris etc... passeront par cette procédures.

Je ne comprend pas bien ta question concernant ta variable Public dans une sub située dans form1.
Si tu veux faire un compteur de messages reçu alors tu declare ta variable au niveau du module et tu l'exploites directement dans le filtre via Select Case.

Je ne peux pas en dire plus car je ne saisi pas ce que tu veux faire.
Enfin j'espère t'avoir donné une petite reponse.

Je te souhaite une bonne continuation.
a+ Nocturne
cs_salazar Messages postés 241 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 19 février 2006 2
26 janv. 2005 à 18:34
Je constate que lorsqu'on utilise SetWindowLong/CallWindowProc pour lire des messages provenant de Windows, si on fait appel à une fonction dans le corps de ce pgm, les variables publiques utilisées par cette fonction sont NULL.

Comment faire pour résoudre ce pb ?

Par exemple, au lieu d'afficher avec le Label6 le Texte_Recu, fait appel à une sub située dans form1 qui afficherait le contenu d'une variable déclarée en public dans form1, qui compterait de 1 à 100...
Tu t'appercevras que cette variable est toujours affichée à 0 dès qu'il y a 1 uMsg.
Comme j'ai ce pb, peut etre que tu as la solution ? Je suppose qu'il y a soit une astuce pour faire appel à la sub, soit une astuce pour déclarer la variable public.

Sinon 12/10 me paraissent mérités !
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
18 janv. 2005 à 02:43
Salut Drakkhen, la source est maintenant corrigé.
Bonne continuation dans le monde du developpement.
A+, Nocturne
cs_Drakkhen Messages postés 23 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 14 janvier 2005
18 janv. 2005 à 00:40
Hello,
phtribaudeau a raison...

Dans la fonction suivante, la longueur de la chaîne est renvoyée à Resultat, et non l'id de l'atome :

Resultat = GlobalGetAtomName(Atom_Recu, Texte_Recu, 256)

Donc quand tu fais appel à GlobalDeleteAtom avec Resultat :

Resultat = GlobalDeleteAtom(Resultat)

...soit tu ne supprimes aucun Atome, soit tu supprimes le mauvais. Donc soit la mémoire se remplit gentillement, soit le système commence à perdre sa stabilité. :p
Dans les deux cas, c'est pas bon. Tu devrais vite modifier ça.

Sinon la source est excellente, simple et efficace. 10/10

A+
phtribaudeau Messages postés 14 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 16 novembre 2004
22 juil. 2004 à 11:10
Attention Nocturne, je pense quand même que ça ne marche pas avec la variable Resultat. Ca peut meme faire plus de degat qu'autre chose à partir d'un certain nombre de messages (récupération de message de Windows qui n'ont rien à voir avec les messages de ton application). Ca peut même provoquer des problèmes pour les utilisations des OLE et des DDE.

A+ et encore bravo pour ton code.
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
21 juil. 2004 à 11:09
Salut phtribaudeau,
Oui tu as raison, utilise 'Atom_Recu', mais ca a l air de marche avec Resultat.
Merci pour la remarque.
a+
phtribaudeau Messages postés 14 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 16 novembre 2004
21 juil. 2004 à 10:11
Salut,
je viens de regarder ton code que je trouve génial. Merci beaucoup.
Par contre, avec un collègue, nous pensons avoir trouvé une erreur : dans ton module 'Module_Receveur.Bas', dans la fonction 'Capture_Message_Windows()', la fonction GlobalDeleteAtom() doit avoir pour parametre le numero d'atome recu : 'Atom_Recu', et non pas la variable 'Resultat'.
Qu'en penses-tu ?
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
11 mai 2004 à 20:30
Si tu parles de message Windows et bien c'est une très bonne question antoineraymond.
Je ne sais pas exactement, je me suis egalement posé la question.
Je sais qu'il y a une API qui permet de lister les processus à distance sur un autre PC mais après je ne sais pas comment faire pour gérer les messages Windows sur le poste destinataire.

Si quelqu'un a une idée sur la question, qu'il nous informe de la démarche a effectuer.

Autrement il y aurait bien une solution dans le contexte Client/Serveur mais ca veut dire de faire une application sur le poste destinataire qui permetrait de faire cela.

Si tu trouves qq chose informe moi.
Bonne prog à toi.
Nocturne
antoineraymond Messages postés 99 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 4 décembre 2008
11 mai 2004 à 17:19
Pouvons-nus envoyer un message à une application qui est sur un autre poste
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
11 mai 2004 à 11:15
Merci cristiandan pour ton commentaire, j'espere que cette source pourra t'aider.
Bonne prog.
a+
cristiandan Messages postés 52 Date d'inscription lundi 26 novembre 2001 Statut Membre Dernière intervention 4 novembre 2005
11 mai 2004 à 09:34
ca m'a l'air génial. Je n'ai pas regardé trop en détail, mais ca rejoins un projet que je voulais développer dans ce sens.
Rejoignez-nous