none
Comunicação Entre 2 Aplicativos RRS feed

  • Pergunta

  • Olá,

     

    Estou com um pequeno problema, tenho dois aplicativos que precisa se comunicar entre eles, aplicação 1 envia uma mensagem para aplicação 2 que retorna o param1 e o param2, aplicação 1 recebe os valores corretamente o problema é que fica em loop aplicação 1 fica recebendo o tempo todo não para nunca.

    Alguém sabe que esta errado no meu código.

     

     

    '------ APLICAÇÃO 1

     

    Public Class Form1

    Const WM_CUSTOMMSG As Integer = &H400

    Private HWND_BROADCAST As New IntPtr(65535)

    Private ourActivateMessage As Integer

    Dim Msg As New MsgWindow(Me)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim activateMessage As Message = Message.Create(HWND_BROADCAST, WM_CUSTOMMSG, IntPtr.Zero, IntPtr.Zero)

    MessageWindow.PostMessage(activateMessage)

    End Sub

    <DllImport("CoreDll.Dll")> _

    Private Shared Function RegisterWindowMessage(ByVal lpString As String) As Integer

    End Function

    Public Declare Function FindWindow Lib "Coredll" Alias "FindWindowW" ( _

    ByVal lpClassName As String, _

    ByVal lpWindowName As String _

    ) As IntPtr

    End Class

    Public Class MsgWindow

    Inherits MessageWindow

    Const WM_CUSTOMMSG As Integer = &H400

    Private ourActivateMessage As Integer

    Private mainForm As Form

    <DllImport("CoreDll.Dll")> _

    Private Shared Function RegisterWindowMessage(ByVal lpString As String) As Integer

    End Function

    Public Sub New(ByVal mainForm As Form)

    Me.mainForm = mainForm

    Dim applicationName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

    Me.ourActivateMessage = RegisterWindowMessage(applicationName)

    End Sub

    Protected Overrides Sub WndProc(ByRef msg As Message)

    MyBase.WndProc(msg)

    Select Case msg.Msg

    Case WM_CUSTOMMSG

    Console.WriteLine(msg.WParam.ToString)

    Console.WriteLine(msg.LParam.ToString)

    End Select

    End Sub

    End Class

     

    '------ APLICAÇÃO  2

     

    Imports Microsoft.WindowsCE.Forms

    Imports System.Runtime.InteropServices

    Public Class Form1

    Dim Msg As New MsgWindow(Me)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    End Class

    Public Class MsgWindow

    Inherits MessageWindow

    Private HWND_BROADCAST As New IntPtr(65535)

    Const WM_CUSTOMMSG As Integer = &H400

    Private ourActivateMessage As Integer

    Private mainForm As Form

    <DllImport("CoreDll.Dll")> _

    Private Shared Function RegisterWindowMessage(ByVal lpString As String) As Integer

    End Function

    Private param1 As Long = -16

    Private param2 As Long = -40

    Public Sub New(ByVal mainForm As Form)

    Me.mainForm = mainForm

    Dim applicationName As String = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

    Me.ourActivateMessage = RegisterWindowMessage(applicationName)

    End Sub

    Protected Overrides Sub WndProc(ByRef msg As Message)

    MyBase.WndProc(msg)

    Select Case msg.Msg

    Case WM_CUSTOMMSG

    EnviaRetorno()

    End Select

    End Sub

    Public Sub EnviaRetorno()

    Dim msg As Message = Message.Create(HWND_BROADCAST, WM_CUSTOMMSG, New IntPtr(param1), New IntPtr(param2))

    MessageWindow.PostMessage(msg)

    End Sub

    End Class

     

    segunda-feira, 31 de março de 2008 12:59

Todas as Respostas

  • Olá,

     

    Acho que o seu problema é que faltou você chamar a classe base WndProc(), ela que informará ao Windows que a mensagem foi processada. Por exemplo na primeira aplicação, no final do método WndProc(), coloque:

     

    Code Snippet
    MyBase.WndProc(m)

     

     

     

    Você pode dar uma olhada neste exemplo: http://support.microsoft.com/kb/311317

     

    []s,

     

     

     

    quinta-feira, 3 de abril de 2008 01:37