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
[WINDOWSPHONE7] LECTEUR DE FLUX RSS[WINDOWSPHONE7] LECTEUR DE FLUX RSS par Vko
Parce que j'aime pas tester à moitié, je me suis amusé à développer un petit lecteur de flux RSS avec un look qui vous rappellera surement quelque chose :) La RC de Visual Studio est plutôt molle mais fonctionne correctement. L'émulateur est pas...
Cliquez pour lire la suite de l'article par Vko [WP7] L'éMULATEUR WINDOWS PHONE 7 EST MULTITâCHE[WP7] L'éMULATEUR WINDOWS PHONE 7 EST MULTITâCHE par KooKiz
Une question qui reste en suspend concernant Windows Phone 7 est de savoir si le système permettra à plusieurs applications de s'exécuter simultanément, ou si un système de mise en pause similaire à celui de l'iPhone sera adopté. Même si cela ne perm...
Cliquez pour lire la suite de l'article par KooKiz PRéSENTATION CLUB MOSS CE JOUR "LA NOUVELLE ARCHITECTURE DE SERVICES SHAREPOINT 2010".PRéSENTATION CLUB MOSS CE JOUR "LA NOUVELLE ARCHITECTURE DE SERVICES SHAREPOINT 2010". par Patrick Guimonet
Ca y est la sortie RTM de SharePoint 2010 est annoncée pour le 16 avril 2010 (annonce faite ce jour par Erol Giraudy lors de la réunion du club MOSS). Vous pourrez trouver ici les slides de ma présentation du jour dans le cadre du club MOSS : 201...
Cliquez pour lire la suite de l'article par Patrick Guimonet [WINDOWPHONE7] PREMIERS PAS[WINDOWPHONE7] PREMIERS PAS par Vko
Hop voici les premiers pas avec les outils de développement pour Windows Phone 7. Premier changement suite à l'installation des outils : les type de projets pour la plateforme Windows Phone 7. Les projets se découpent en deux groupes : Les projet...
Cliquez pour lire la suite de l'article par Vko [WP7] LE SDK DE WINDOWS PHONE 7 EST DISPONIBLE ![WP7] LE SDK DE WINDOWS PHONE 7 EST DISPONIBLE ! par KooKiz
Comme le titre l'indique, une première CTP du kit de développement pour Windows Phone 7 est disponible. Basé sur Visual Studio 2010 Express, il propose de développer des applications pour WP7 en Silverlight ou XNA 4. Un émulateur est bien entendu de l...
Cliquez pour lire la suite de l'article par KooKiz
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|