2012-12-14 6 views
0

Целью является послать сообщение из приложения vb.net в другое приложение, используя winapi sendmessage. Я не могу заставить его работать. Ваша помощь очень ценитсяПреобразование C++ в VB.NET

Это то, что у меня есть, но это не похоже на работу

Public Class WinAPI 
    Private hwnd As Integer 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal lpClassName As String, _ 
      ByVal lpWindowName As String) As IntPtr 

    'FindWindowByClass 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal lpClassName As String, _ 
      ByVal zero As IntPtr) As IntPtr 

    'FindWindowByCaption 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal zero As IntPtr, _ 
      ByVal lpWindowName As String) As IntPtr 

    Private Declare Auto Function SendMessage Lib "user32" _ 
     (ByVal hWnd As IntPtr, _ 
     ByVal Msg As Integer, _ 
     ByVal wParam As IntPtr, _ 
     ByRef lParam As COPYDATASTRUCT) As Boolean 

    Public Const WM_COPYDATA As Integer = &H4A 

    <StructLayout(LayoutKind.Sequential)> _ 
    Structure COPYDATASTRUCT 
     Dim dwData As Long 
     Dim cbData As Long 
     Dim lpData As IntPtr 
    End Structure 

    Public Sub SendToeSignal(ByVal strMessage As String) 
     hwnd = FindWindow(vbNullString, "eSignalSink") 
     ' hwnd = FindWindow("eSignalSink", "vbNullString") 
     Dim DataStruct As New COPYDATASTRUCT 
     ' strMessage = "1" & "," & strMessage & Chr(0) & vbCr 'Null terminated & carriage return 
     strMessage = "1" & "," & strMessage & vbCr 'Null terminated & carriage return 

     DataStruct.dwData = 1 
     DataStruct.cbData = strMessage.Length * Marshal.SystemDefaultCharSize 
     DataStruct.lpData = Marshal.StringToCoTaskMemAuto(strMessage) 

     SendMessage(hwnd, WM_COPYDATA, 0, DataStruct) 
     Marshal.FreeCoTaskMem(DataStruct.lpData) 

    End Sub 
End Class 
+2

Что это * кажется * делать? –

ответ

2

Похоже, у вас есть определение VB6 стиль вашего COPYDATASTRUCT попробовать это вместо этого.

Сверху PInvoke ссылка:

<StructLayout(LayoutKind.Sequential)> _ 
Structure COPYDATASTRUCT 
    Public dwData As IntPtr 
    Public cdData As Integer 
    Public lpData As IntPtr 
End Structure 

Прежде всего, сделайте себе одолжение и позволить Option Strict EXPECIALLY при работе с функциями API. Вы отправляете структуру между вашими приложениями и вам нужно будет убедиться, что вы можете получить ее в принимающем приложении. Я внес некоторые изменения в ваш примерный код, и он работает, получив данные в тестовой программе, что основная форма называется TestApp.

Ваш пример с модификациями

Option Strict On 
Imports System.Runtime.InteropServices 

Public Class Form1 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     Dim myWinAPI As WinAPI = New WinAPI 
     myWinAPI.SendToeSignal("Hello World") 
     ' Add any initialization after the InitializeComponent() call. 
    End Sub 
End Class 

Public Class WinAPI 

    Private hwnd As IntPtr 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal lpClassName As String, _ 
      ByVal lpWindowName As String) As IntPtr 

    'FindWindowByClass 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal lpClassName As String, _ 
      ByVal zero As IntPtr) As IntPtr 

    'FindWindowByCaption 
    Private Declare Auto Function FindWindow Lib "user32" _ 
      (ByVal zero As IntPtr, _ 
      ByVal lpWindowName As String) As IntPtr 

    Private Declare Auto Function SendMessage Lib "user32" _ 
      (ByVal hWnd As IntPtr, _ 
      ByVal Msg As Integer, _ 
      ByVal wParam As IntPtr, _ 
      ByRef lParam As COPYDATASTRUCT) As Boolean 

    Public Const WM_COPYDATA As Integer = &H4A 

    <StructLayout(LayoutKind.Sequential)> _ 
    Structure COPYDATASTRUCT 
     Dim dwData As IntPtr 
     Dim cbData As Integer 
     Dim lpData As IntPtr 
    End Structure 

    Public Sub SendToeSignal(ByVal strMessage As String) 
     hwnd = FindWindow(IntPtr.Zero, "TestApp") 
     Dim DataStruct As New COPYDATASTRUCT 
     strMessage = "1" & "," & strMessage & vbCr 'Null terminated & carriage return 

     DataStruct.dwData = CType(1, IntPtr) 
     DataStruct.cbData = strMessage.Length * Marshal.SystemDefaultCharSize 
     DataStruct.lpData = Marshal.StringToCoTaskMemAuto(strMessage) 

     SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, DataStruct) 
     Marshal.FreeCoTaskMem(DataStruct.lpData) 

    End Sub 

    Public Sub New() 

    End Sub 
End Class 

получения заявки

Imports System.Runtime.InteropServices 
Imports System.Text 

Public Class Form1 
    <StructLayout(LayoutKind.Sequential)> _ 
    Structure COPYDATASTRUCT 
     Dim dwData As IntPtr 
     Dim cbData As Integer 
     Dim lpData As IntPtr 
    End Structure 
    Public Const WM_COPYDATA As Integer = &H4A 
    Dim split() As String = New String() {",", " "} 
    Dim myData() As String 

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     MyBase.WndProc(m) 
     If m.Msg = WM_COPYDATA Then 
      Dim CD As COPYDATASTRUCT = DirectCast(m.GetLParam(GetType(COPYDATASTRUCT)), COPYDATASTRUCT) 
      Dim B As Byte() = New Byte(CD.cbData - 1) {} 
      Dim lpData As IntPtr = CD.lpData 
      Marshal.Copy(lpData, B, 0, CD.cbData) 
      Dim strData As String = Encoding.[Default].GetString(B) 
      myData = strData.Split(split, StringSplitOptions.None) 
     End If 
    End Sub 
End Class 
+0

Изменен состав, все еще не работает – user1905155

+0

@ user1905155 см. Мое редактирование –

+0

Спасибо, что проблема решена – user1905155

0

Спасибо за первый пример, который почти работал для моего приложения. Применение приемника необходимо строку в ANSI (WinAmp), так что я должен был изменить строку:

DataStruct.lpData = Marshal.StringToCoTaskMemAuto(strMessage) 

к

DataStruct.lpData = Marshal.StringToCoTaskMemAnsi(strMessage) 

Кроме того, он работал как шарм, первый пример, который получил указатели правильно для x64 - x32. Только жаль, что я нашел, что это первый в моей 24 ч поисках

Win 10. Visualstudio2017 vb.net

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