2014-01-14 5 views
0

Привет всем, я нашел этот код here в C#, который позволяет использовать SendMessage API для отправки сообщений взад и вперед от запущенных приложений .net. Во время тестирования все хорошо сочетается с кодом C#, но мне нужно преобразовать его в VB.net.Связь между приложениями vb.net

Так я использовал онлайн C# -> VB.net конвертер и получил это:

Импорт System.Runtime.InteropServices

Public Class Form1 
    Inherits System.Windows.Forms.Form 
    Private Const RF_TESTMESSAGE As Integer = &HA123 

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
    Public Shared Function SendMessage(ByVal hwnd As IntPtr, <MarshalAs(UnmanagedType.U4)> ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer 
    End Function 

    Public Sub New() 
     InitializeComponent() 
     Me.Text = String.Format("This process ID: {0}", Process.GetCurrentProcess().Id) 
    End Sub 

    <STAThread()> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Application.EnableVisualStyles() 
     Application.Run(New Form1()) 
    End Sub 

    Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
     Dim proc As Process = Process.GetCurrentProcess() 
     Dim processes As Process() = Process.GetProcessesByName(proc.ProcessName) 

     If processes.Length > 1 Then 
      For Each p As Process In processes 
       If p.Id <> proc.Id Then 
        SendMessage(p.MainWindowHandle, RF_TESTMESSAGE, IntPtr.Zero, IntPtr.Zero) 
       End If 
      Next 
     Else 
      MessageBox.Show("No other running applications found.") 
     End If 
    End Sub 

    Protected Overrides Sub WndProc(ByRef message As Message) 
     If message.Msg = RF_TESTMESSAGE Then 
      ListBox1.Items.Add("Received message RF_TESTMESSAGE") 
     End If 

     MyBase.WndProc(message) 
    End Sub 
End Class 

Однако, используя код выше для моих приложений не кажется, произведите любое действие sendmessage, когда оно дойдет до . Если процессы. Длина> 1 Затем. Он всегда говорит мне Других запущенных приложений не найдено., несмотря на то, что у меня есть оба приложения, запущенные, как я сделал на примере C#.

У меня должно быть что-то, что не переносилось при конвертации. Любая помощь будет полезна, чтобы исправить это!

+1

'оба приложения работают' - два экземпляра одной и той же программы или разные программы? Кстати, почему бы вам не использовать WCF? –

+2

Хороший Лорд, научиться писать код на C#, у вас будет меньше времени, чем получение этого конверта для запуска. Какова моя рекомендация, понимание C# является довольно сложным требованием для программистов VB.NET в наши дни. –

+0

Ссылка на сообщение в блоге здесь не работает. Возможно, пришло время подумать об использовании первоклассного метода межпроцессного взаимодействия, такого как WCF, или даже Remoting. См. Также http://stackoverflow.com/questions/2082450/communication-between-c-sharp-applications-the-easy-way –

ответ

0

Тот факт, что вы получаете сообщение «Нет других запущенных приложений», указывает на проблему в этом бите кода. Проверьте мои заметки здесь:

Dim proc As Process = Process.GetCurrentProcess() 
    //This gets an array of all processes currently running with the same name 
    // as this application. 
    Dim processes As Process() = Process.GetProcessesByName(proc.ProcessName) 

    //If there is only one process with this application's name, then it's 
    // THIS process, so there aren't any others by the same name running 
    // right now. 
    If processes.Length > 1 Then 
     For Each p As Process In processes 
      If p.Id <> proc.Id Then 
       SendMessage(p.MainWindowHandle, RF_TESTMESSAGE, IntPtr.Zero, IntPtr.Zero) 
      End If 
     Next 
    Else 
     //Thus, this gets called because there are not other applications with 
     //the same name. 
     MessageBox.Show("No other running applications found.") 
    End If 

Пожалуйста, обратите внимание, что при запуске кода в environement, современная студийная версия обычно отображаются как Devenv.exe, поэтому запуск двух экземпляров IDE должны нормально работать. Однако! В Visual Studio есть опция для запуска кода под собственным именем приложения (исполняемого файла). Если вы перейдете на ваш Project Properties ->Debug, есть опция с пометкой Enable the Visual Studio hosting process. Отключение этого флажка приведет к запуску кода под именем его скомпилированного исполняемого файла.

Смежные вопросы