0

目的は、winapisendmessageを使用して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
4

2 に答える 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 StrictAPI関数を使用しているときに、自分自身を支持し、特に有効にします。アプリケーション間で構造を送信しているので、受信側のアプリケーションで構造を取得できることを確認する必要があります。サンプルコードにいくつかの変更を加えましたが、メインフォームの名前がテストプログラムでデータを受け取って機能します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
于 2012-12-14T21:59:35.980 に答える