Accueil > > > MODULE DE COMMUNICATION ENTRE APPLICATION
MODULE DE COMMUNICATION ENTRE APPLICATION
Information sur la source
Description
Bonjour,
Avant j'utilisais la méthode DDE pour faire communiquer deux applications, il semble que cela ne puisse malheureusement pas répondre aux attentes de tous le monde, effectivement tous le monde ne peux pas passer par l'événement DDE.
En cherchant a droite a gauche j'ai monté ce module a la demande d'un utilisateur du site, cependant j'espère que certain d'entre vous seront a même de m'aide améliorer ce bout de code.
Mode d'utilisation :
1. Vous créez un nouveau module à votre code
2. Vous collez le code ci dessous dedans
3. Vous ajouter la commande : PROCEDURE_SENDINFINTEREXE Me, "Application Cible", "Message"
Application Cible est le Caption de l'application qui doit recevoir l'information
Message est le message que vous souhaitez transférer.
Source
- '=======================================================================================================
- 'MODULE DE COMMUNICATION INTER EXÉCUTABLE
- ' - On devis la totalité des messages Windows vers l'application qui écoute
- ' - Si les message nous intéresse on les traites dans le cas contraire on les rends a Windows
- ' - Pour utiliser ce module :
- ' 1. Mettre dans le Form_Load l'instruction suivante :
- ' PROCEDURE_MODEECOUTE Me, True, LBL_AFFICHAGE
- ' 2. Mettre dans la commande d'envoie d'information :
- ' PROCEDURE_SENDINFINTEREXE Me, "Application Cible", "MEDIAVIDEO;POSITIONMINISUB"
- ' - ATTENTION, un plantage avec le détournement des messages Windows rend le debugage de l'application très sensible
- '=======================================================================================================
- Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lngParam As Long) As Long
- Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
- Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
-
- Global lpPrevWndProc As Long
- Global gHW As Long
-
- Public Const GWL_WNDPROC = (-4)
- Public Const WM_COPYDATA = &H4A 'Numero du Message windows
-
- Type COPYDATASTRUCT
- DwData As Long
- CbData As Long
- LpData As Long
- End Type
-
- Public Temp As Long
- Public TempReceptInformation As String
- Public ObjectReceptInformation As Label
-
- '=======================================================================================================
- 'PROCEDURE POUR ENVOYER DES INFORMATIONS VERS UNE APPLICATION QUI EST A L'ECOUTE
- '=======================================================================================================
- 'Exemple :
- 'PROCEDURE_SENDINFINTEREXE Me, "Application Cible", "Message"
- '=======================================================================================================
- Public Sub PROCEDURE_SENDINFINTEREXE(FormObjectName As Form, CaptionExeDest As String, StrTemp As String)
- Dim CdCopyData As COPYDATASTRUCT
- Dim ThWnd As Long
- Dim ByteBuffer(1 To 255) As Byte
-
- ThWnd = FindWindow(vbNullString, CaptionExeDest) 'Recherche le handle de l'application
-
- Call CopyMemory(ByteBuffer(1), ByVal StrTemp, Len(StrTemp)) 'Copie la chaine dans la structure à envoyer
- CdCopyData.DwData = 3
- CdCopyData.CbData = Len(StrTemp) + 1
- CdCopyData.LpData = VarPtr(ByteBuffer(1))
- I = SendMessage(ThWnd, WM_COPYDATA, FormObjectName.hwnd, CdCopyData) 'Envoye du message
-
- Do While ObjectReceptInformation.Caption = ""
- ObjectReceptInformation.Caption = "En Attente reception"
- Loop
-
- End Sub
-
- '=======================================================================================================
- 'PROCEDURE POUR ENVOYER DES INFORMATIONS VERS UNE APPLICATION QUI EST A L'ECOUTE
- '=======================================================================================================
- 'Attention le LabelObject est optionnel mais uniquement sur un retour de procedure de Ecoute a False
- '=======================================================================================================
- Public Sub PROCEDURE_MODEECOUTE(FormObject as Form, EcouteMode As Boolean, Optional LabelObject As Label)
- gHW = FormObject.hwnd
- Select Case EcouteMode
- Case True 'Détourne les Messages windows vers la fonction WindowProc
- lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
- Set ObjectReceptInformation = LabelObject
- Case False 'Demande à Windows de ne plus envoyer les Message
- Temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
- Set ObjectReceptInformation = Nothing
- End Select
-
- End Sub
-
- '=======================================================================================================
- 'FONCTION SUR ECOUTE INTERCEPTE ET INTERPRETE LES MESSAGE WINDOWS UTILE POUR LE HOOK = TRUE
- '=======================================================================================================
- Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lngParam As Long) As Long
- If uMsg = WM_COPYDATA Then 'On reçoit TOUS les messages mais seul WM_COPYDATA nous interresse
- Call InterProcessComms(lngParam) 'On appel la procedure d'analyse du message
- End If 'Si le message n'est pas interressant on les rend à Windows pour les gérer
- WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lngParam)
-
- End Function
-
- '=======================================================================================================
- 'PROCEDURE PERMETTANT D'AFFICHER LE MESSAGE EN PROVENANCE DE L'ECOUTE SUR LA FONCTION WINDOWPROC
- '=======================================================================================================
- Sub InterProcessComms(lngParam As Long)
- Dim CdCopyData As COPYDATASTRUCT
- Dim ByteBuffer(1 To 255) As Byte
- Dim StrTemp As String
-
- Call CopyMemory(CdCopyData, ByVal lngParam, Len(CdCopyData))
- Select Case CdCopyData.DwData
- Case 1
- Debug.Print "1"
- Case 2
- Debug.Print "2"
- Case 3
- Call CopyMemory(ByteBuffer(1), ByVal CdCopyData.LpData, CdCopyData.CbData)
- StrTemp = StrConv(ByteBuffer, vbUnicode)
- StrTemp = Left$(StrTemp, InStr(1, StrTemp, Chr$(0)) - 1)
- ObjectReceptInformation.Caption = StrTemp
- End Select
-
- End Sub
'=======================================================================================================
'MODULE DE COMMUNICATION INTER EXÉCUTABLE
' - On devis la totalité des messages Windows vers l'application qui écoute
' - Si les message nous intéresse on les traites dans le cas contraire on les rends a Windows
' - Pour utiliser ce module :
' 1. Mettre dans le Form_Load l'instruction suivante :
' PROCEDURE_MODEECOUTE Me, True, LBL_AFFICHAGE
' 2. Mettre dans la commande d'envoie d'information :
' PROCEDURE_SENDINFINTEREXE Me, "Application Cible", "MEDIAVIDEO;POSITIONMINISUB"
' - ATTENTION, un plantage avec le détournement des messages Windows rend le debugage de l'application très sensible
'=======================================================================================================
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lngParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Global lpPrevWndProc As Long
Global gHW As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_COPYDATA = &H4A 'Numero du Message windows
Type COPYDATASTRUCT
DwData As Long
CbData As Long
LpData As Long
End Type
Public Temp As Long
Public TempReceptInformation As String
Public ObjectReceptInformation As Label
'=======================================================================================================
'PROCEDURE POUR ENVOYER DES INFORMATIONS VERS UNE APPLICATION QUI EST A L'ECOUTE
'=======================================================================================================
'Exemple :
'PROCEDURE_SENDINFINTEREXE Me, "Application Cible", "Message"
'=======================================================================================================
Public Sub PROCEDURE_SENDINFINTEREXE(FormObjectName As Form, CaptionExeDest As String, StrTemp As String)
Dim CdCopyData As COPYDATASTRUCT
Dim ThWnd As Long
Dim ByteBuffer(1 To 255) As Byte
ThWnd = FindWindow(vbNullString, CaptionExeDest) 'Recherche le handle de l'application
Call CopyMemory(ByteBuffer(1), ByVal StrTemp, Len(StrTemp)) 'Copie la chaine dans la structure à envoyer
CdCopyData.DwData = 3
CdCopyData.CbData = Len(StrTemp) + 1
CdCopyData.LpData = VarPtr(ByteBuffer(1))
I = SendMessage(ThWnd, WM_COPYDATA, FormObjectName.hwnd, CdCopyData) 'Envoye du message
Do While ObjectReceptInformation.Caption = ""
ObjectReceptInformation.Caption = "En Attente reception"
Loop
End Sub
'=======================================================================================================
'PROCEDURE POUR ENVOYER DES INFORMATIONS VERS UNE APPLICATION QUI EST A L'ECOUTE
'=======================================================================================================
'Attention le LabelObject est optionnel mais uniquement sur un retour de procedure de Ecoute a False
'=======================================================================================================
Public Sub PROCEDURE_MODEECOUTE(FormObject as Form, EcouteMode As Boolean, Optional LabelObject As Label)
gHW = FormObject.hwnd
Select Case EcouteMode
Case True 'Détourne les Messages windows vers la fonction WindowProc
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
Set ObjectReceptInformation = LabelObject
Case False 'Demande à Windows de ne plus envoyer les Message
Temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
Set ObjectReceptInformation = Nothing
End Select
End Sub
'=======================================================================================================
'FONCTION SUR ECOUTE INTERCEPTE ET INTERPRETE LES MESSAGE WINDOWS UTILE POUR LE HOOK = TRUE
'=======================================================================================================
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lngParam As Long) As Long
If uMsg = WM_COPYDATA Then 'On reçoit TOUS les messages mais seul WM_COPYDATA nous interresse
Call InterProcessComms(lngParam) 'On appel la procedure d'analyse du message
End If 'Si le message n'est pas interressant on les rend à Windows pour les gérer
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lngParam)
End Function
'=======================================================================================================
'PROCEDURE PERMETTANT D'AFFICHER LE MESSAGE EN PROVENANCE DE L'ECOUTE SUR LA FONCTION WINDOWPROC
'=======================================================================================================
Sub InterProcessComms(lngParam As Long)
Dim CdCopyData As COPYDATASTRUCT
Dim ByteBuffer(1 To 255) As Byte
Dim StrTemp As String
Call CopyMemory(CdCopyData, ByVal lngParam, Len(CdCopyData))
Select Case CdCopyData.DwData
Case 1
Debug.Print "1"
Case 2
Debug.Print "2"
Case 3
Call CopyMemory(ByteBuffer(1), ByVal CdCopyData.LpData, CdCopyData.CbData)
StrTemp = StrConv(ByteBuffer, vbUnicode)
StrTemp = Left$(StrTemp, InStr(1, StrTemp, Chr$(0)) - 1)
ObjectReceptInformation.Caption = StrTemp
End Select
End Sub
Conclusion
Comme je l'ai dit plus haut. Détourner les messages Windows rends le debugage de l'application très très sensible. Je vous suggère de ne pas avoir d'erreur si vous avez déjà lancé la procédure de réception d'information !
Si quelqu'un (Reinfield vu que tu vas sans doute être le premier a poste :p) a une idée pour éviter le plantage de VB quand on passe en debugage.
P.S. Un grand merci a Sephiro pour le code initial
Historique
- 12 mai 2009 17:11:38 :
- (Aucune)
- 13 mai 2009 16:00:14 :
- Il manquait une ligne de code qui rendait l'écoute impossible c'est corrigé !
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Communication avec un module de capture Easykey en RS485 [ par douds5 ]
J'ai un probleme de communciation avec des modules Easykey. A chaque fois que j'envoi une trame j'ai en retour le même trame que j'ai envoyé. Pourtant
formulaire qui se comporte comme un mgbox [ par Marquo ]
Bonjour,dans un module, j'ai une boucle qui lit ds un fichier, pour chaque ligne lue je veux afficher un formulaire de confirmation(style msgbox) et j
Communication PIC 16F84 VB6 par port série [ par Sebcbien06 ]
Bonjour,Je voudrais communiquer entre un PIC et Visual basic6 par port série RS232. J'ai essayé d'utiliser MSCOMM control mais sans succés.Quelqun pou
pb VBA : réaliser un lien d'une macro vers une autre [ par bogosse121 ]
Pour Ecxel, je recherche un moyen de réaliser un lien dans un module à la suite d'une macro vers un autre module pour exécuter une autre macro. Il est
module et class module [ par Trainkill666 ]
La question peut paraitre bete mais je sais pas la diff entre un module et un class module, form et MDI form, qq peut me renseigner, merci à l'avance
Erreur d''execution (module) [ par Robinwood01 ]
BonjourJ'ai créer un programme (*.exe). Celui ci marche sur certaine machine mais pas sur toute.Sur une j'ai ce mesage d'erreur :erreur systeme 8:h80
communication inter Application [ par espadon2 ]
Bonjour à tous,J' ai une appli vb qui execute une partie d'une autre appli commercial . Cette appli commercial execute un script pour incorporer dans
communication via port série RS232 [ par sebastienbothier ]
dans le cadre d'une étude, je dois établir une connexion entre un PC et un multimetre via une cable RS232, étant novice en programmation VB, quelqu'un
Communication avec le lecteur de code à barre [ par boule7 ]
Je voudrais insérer la lecture de code à barre dans mon programme de gestion de point de vente mais je sais pas comment faire. Aidez moi.
communication avec un lecteur de code barre [ par twamaya ]
Bonjour à tous,j'ai un petit souci, j'ai un lecteur de code barre et j'aimerais bien écrire un petit programme en vb pouvant recuperer les infos lues
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|