ECHANGE DE MESSAGES WINDOWS ENTRE DEUX APPLICATIONS
cristiandan
Messages postés52Date d'inscriptionlundi 26 novembre 2001StatutMembreDernière intervention 4 novembre 2005
-
11 mai 2004 à 09:34
totoalecole
Messages postés2Date d'inscriptionlundi 12 juillet 2010StatutMembreDernière intervention12 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.
totoalecole
Messages postés2Date d'inscriptionlundi 12 juillet 2010StatutMembreDernière intervention12 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és2Date d'inscriptionlundi 12 juillet 2010StatutMembreDernière intervention12 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és24Date d'inscriptionmercredi 8 août 2007StatutMembreDerniè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és218Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention15 novembre 20091 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és241Date d'inscriptionmercredi 1 octobre 2003StatutMembreDernière intervention19 février 20062 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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és7Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és97Date d'inscriptiondimanche 24 avril 2005StatutMembreDerniè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és3Date d'inscriptionvendredi 5 juillet 2002StatutMembreDernière intervention20 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és3Date d'inscriptionvendredi 5 juillet 2002StatutMembreDernière intervention20 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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és241Date d'inscriptionmercredi 1 octobre 2003StatutMembreDernière intervention19 février 20062 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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és23Date d'inscriptionvendredi 14 mars 2003StatutMembreDernière intervention14 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 :
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és14Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention16 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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és14Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention16 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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és99Date d'inscriptionmardi 6 avril 2004StatutMembreDerniè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és115Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention15 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és52Date d'inscriptionlundi 26 novembre 2001StatutMembreDerniè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.
12 juil. 2010 à 13:12
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 ???????????
12 juil. 2010 à 12:37
dim Resultat_Find_Appli as long = 0
Resultat_Find_Appli = FindWindow(vbNullString, "nom_de_fenetre_inexistant")
quelqu'un saurait-il pourquoi ?
8 nov. 2008 à 13:16
Merci pour cette source :)
30 janv. 2007 à 14:34
25 janv. 2006 à 23:01
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...
25 janv. 2006 à 21:11
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.
25 janv. 2006 à 18:44
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 ?
13 janv. 2006 à 19:17
13 janv. 2006 à 17:15
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.
13 janv. 2006 à 16:54
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+
13 janv. 2006 à 16:45
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 :-)
13 oct. 2005 à 09:55
D'ailleurs j'ai un pb pour la conversion du code, au niveau de l'override de la fonction WndProc avec la commande AddressOf...
11 oct. 2005 à 15:33
A part quelques exceptions comme GetKeyState(), quasi toute l'API win32 retourne du 32 bits, int ou long en C donc 'Long' en VB.
11 oct. 2005 à 15:15
pour moi j'ai du tout passer en INT !
La fonction FindWindow NE RENVOIT PAS DE LONG MAIS UN INT !!!
Non mais :)
26 janv. 2005 à 22:29
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
26 janv. 2005 à 18:34
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 !
18 janv. 2005 à 02:43
Bonne continuation dans le monde du developpement.
A+, Nocturne
18 janv. 2005 à 00:40
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+
22 juil. 2004 à 11:10
A+ et encore bravo pour ton code.
21 juil. 2004 à 11:09
Oui tu as raison, utilise 'Atom_Recu', mais ca a l air de marche avec Resultat.
Merci pour la remarque.
a+
21 juil. 2004 à 10:11
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 ?
11 mai 2004 à 20:30
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
11 mai 2004 à 17:19
11 mai 2004 à 11:15
Bonne prog.
a+
11 mai 2004 à 09:34