Sending information to other process

DPrometheus

Regular
Joined
Jan 7, 2009
Messages
50
Location
The Netherlands
Hey there

I'm trying to send some messages to another program.
Somehow they never arrive.

The sending application on button click:
Code:
Dim info As New ProcessStartInfo("C:\Users\mso\Documents\Visual Studio 2005\Projects\SwitchApplication\MedicalRecords\bin\Debug\MedicalRecords.exe")
            Dim process As Process
            process = process.Start(info)
            ' Wait for process to be started
            Threading.Thread.Sleep(1500)
            hWnd = process.MainWindowHandle

            Dim Buffer As New StringBuilder(128)
            Buffer.Append(ComboBox1.SelectedValue.ToString)
            MsgBox(Buffer.ToString & "Sent to " & hWnd.ToString)
            SendMessage(hWnd, MSG_PATIENTWISSEL, Nothing, Buffer)

The ' receiving' application
Code:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case CONSTANTS.MSG_PATIENTWISSEL
                Me.Activate()
                _patNr.Append(m.GetLParam( GetType(System.Text.StringBuilder)))
                System.Threading.Thread.Sleep(1500)
                Me.Text += ":" & _patNr.ToString

                MsgBox(_patNr.ToString & " received!")
            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

Private Sub MedicalRecord_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Shows right handle
        Me.Text = Me.Handle
    End Sub

however the handles correspond to eachother, so I'm pretty sure it's the right handle. Also the CONSTANTS.MSG_PATIENTWISSEL constant matches on both applications. The Send messagebox shows up, but the receive messagebox doesn't.

Anybody has an idea of what I'm doing wrong?

thanks,
~ DP

EDIT:
If I put a System.Diagnostics.Debugger.Break() call between
Case CONSTANTS.MSG_PATIENTWISSEL
and
Me.Activate()
the program crashes. (As there is no debugger attached to the second application)

Weird thing is, that it does reach this code. Although the text variable of the form doesn't change, as well as the messagebox seem to be refusing to pop up.

The receiving application also takes focus when the message is actually sent.
 
Last edited:
* The focus could also be a result of the call to
process.Start(info)

I found a little bit more information.. Apparently you have to register your custom messages and can't just use identical numbers to identify messages.
However problem ain't solved yet. Since all messages receive the value 0.

I changed the SendMessage declaration to
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, _
ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
instead of a StringBuilder as lParam.. However if some one has an idea of how I can use the stringbuilder I'm all ears.

Then I sent the message like:
SendMessage(hWnd, CInt(MSG_PATIENTWISSEL), Nothing, CType(ComboBox1.SelectedValue.ToString.Trim, IntPtr))

and receive it like this:
Code:
Case CONSTANTS.MSG_PATIENTWISSEL
                Try
                    Me.Activate()
                    _patNr.Append(m.GetLParam(GetType(IntPtr)).ToString)
...

At the load event I register MSG_PATIENTWISSEL as
CONSTANTS.MSG_PATIENTWISSEL = RegisterWindowMessage("PatientWissel")

Still I receive '0' as nr. instead of a 9 digit number what I sent.. ???


SOLVED:
The problem was in converting IntPtr to Integers and lParam used byref instead of wParam, so used that one instead.

' Receive:
Dim ptr As IntPtr = m.WParam
Dim patNr As Integer = ptr.ToInt32

' Send:
SendMessage(hWnd, CInt(MSG_PATIENTWISSEL), New IntPtr(CInt(ComboBox1.SelectedValue.ToString.Trim)), Nothing)
 
Last edited:
Back
Top