2012-12-14 102 views
0

的目的是使用winapi sendmessage将消息从vb.net应用程序发送到另一个应用程序。我无法让它工作。你的帮助是极大的赞赏将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

它看起来像你有你COPYDATASTRUCT试试这个,而不是一个VB6样式定义。

从上面的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小时的追求

赢10 Visualstudio2017 vb.net