Const WM_COPYDATA As Integer = &H4A Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal MSG As Integer, ByVal wParam As Integer, ByVal lParam As COPYDATASTRUCT) As Integer
Sub main() Dim sendMes As New COPYDATASTRUCT sendMes.lpData = _ New System.Text.StringBuilder("TestAPP" + Chr(0).ToString + "Music" + Chr(0).ToString + "1" + Chr(0).ToString + "{0} - {1}" + Chr(0).ToString + "TEST" + Chr(0).ToString + "TEST") sendMes.cbData = sendMes.lpData.Length + 2 SendMessage(132030, WM_COPYDATA, Nothing, sendMes) End Sub
Public Structure COPYDATASTRUCT Const dwData As Integer = 1351 Public cbData As Integer Public lpData As System.Text.StringBuilder End Structure
Const WM_COPYDATA As Integer = &H4A Declare Ansi Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer Declare Unicode Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hWnd As Integer, ByVal MSG As Integer, ByVal wParam As Integer, ByRef lParam As COPYDATASTRUCT) As Integer
Sub main() Dim sendMes As New COPYDATASTRUCT sendMes.lpData = _ New System.Text.StringBuilder("TestAPP" + ChrW(0).ToString + "Music" + ChrW(0).ToString + "1" + ChrW(0).ToString + "{0} - {1}" + ChrW(0).ToString + "TEST" + ChrW(0).ToString + "TEST") sendMes.cbData = (sendMes.lpData.Length + 1) * 2 SendMessage(FindWindow("MsnMsgrUIManager", Nothing), WM_COPYDATA, Nothing, sendMes) End Sub
Public Structure COPYDATASTRUCT Const dwData As Integer = 1351 Public cbData As Integer Public lpData As System.Text.StringBuilder End Structure
Const WM_COPYDATA As Integer = &H4A Declare Ansi Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer Declare Unicode Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hWnd As Integer, ByVal MSG As Integer, ByVal wParam As Integer, ByRef lParam As System.IntPtr) As Integer
Sub main() Dim sendMes As New COPYDATASTRUCT Dim str As String = "TestAPP" + ChrW(0).ToString + "Music" + ChrW(0).ToString + "1" + ChrW(0).ToString + "{0} - {1}" + ChrW(0).ToString + "TEST" + ChrW(0).ToString + "TEST" Dim ptr As IntPtr sendMes.lpData = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.StringToHGlobalAuto(str)) sendMes.cbData = (str.Length + 1) * 2 System.Runtime.InteropServices.Marshal.StructureToPtr(sendMes, ptr, True) SendMessage(FindWindow("MsnMsgrUIManager", Nothing), WM_COPYDATA, Nothing, ptr) System.Runtime.InteropServices.Marshal.FreeHGlobal(sendMes.lpData) System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr) End Sub
Public Structure COPYDATASTRUCT Const dwData As Integer = 1351 Public cbData As Integer Public lpData As System.IntPtr End Structure
ミスしました。 Dim ptr As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(sendMes)) これだとうまくいくっぽい、、、
Structure COPYDATASTRUCT Dim dwData As Int32 Dim cbData As Int32 Dim lpData As IntPtr End Structure Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal data As IntPtr) As IntPtr Private Declare Ansi Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr Private Sub SongNameSendToMessenger() Dim dtstrct As New COPYDATASTRUCT Dim buf As String = Nothing Const WM_COPYDATA As Integer = &H4A buf = "OrgApp\0Music\01\0{0} - {1}\0曲名\0アーティスト名\0アルバム(シングル)名" & vbNullChar dtstrct.dwData = 1351 dtstrct.cbData = buf.Length * 2 dtstrct.lpData = Marshal.StringToHGlobalUni(buf) Dim MyPointer As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dtstrct)) Marshal.StructureToPtr(dtstrct, MyPointer, False) Dim hWnd As IntPtr = FindWindow("MsnMsgrUIManager", Nothing) Dim ret As IntPtr = SendMessage(hWnd, WM_COPYDATA, 0, MyPointer) Marshal.FreeHGlobal(MyPointer) End Sub
<DllImport("user32.dll", CharSet:=CharSet.Unicode)> _ Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As IntPtr) As IntPtr End Function
<DllImport("user32.dll", CharSet:=CharSet.Unicode)> _ Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr End Function
<DllImport("user32.dll", CharSet:=CharSet.Unicode)> _ Private Shared Function SendMessage(ByVal hWnd As IntPtr, _ ByVal MSG As Integer, _ ByVal wParam As Integer, _ ByRef lParam As COPYDATASTRUCT) As IntPtr End Function
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, pack:=4)> _ Public Structure COPYDATASTRUCT Public dwData As Integer Public cbData As Integer
<MarshalAs(UnmanagedType.LPWStr)> _ Public lpData As String End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sendMes As COPYDATASTRUCT Dim strArray As String() = {"TestAPP", "Music", "1", "{0} - {1}"} Const separator As String = "\0" Dim str As String = String.Join(separator, strArray) Dim byteCount As Integer = Encoding.Unicode.GetByteCount(str)
With sendMes .dwData = 1351 .lpData = str .cbData = byteCount + 2 End With
'メモ張のウィンドウハンドルを取得してみる。 Dim hWnd As IntPtr = FindWindow("Notepad", IntPtr.Zero) Console.WriteLine("hWnd = " & hWnd.ToInt32.ToString("X8")) Dim ret As IntPtr = SendMessage(hWnd, WM_COPYDATA, 0, sendMes) Console.WriteLine("SendMessage = " & ret.ToInt32.ToString("X8")) '自分にも同じメッセージを送ってみる。 ret = SendMessage(Me.Handle, WM_COPYDATA, 0, sendMes) End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) MyBase.WndProc(m) Select Case m.Msg Case WM_COPYDATA Dim dat As COPYDATASTRUCT _ = CType(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT) Console.WriteLine("Received String = " & dat.lpData) End Select End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click With TextBox1 .SuspendLayout() .AppendText("test" & vbCrLf) End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox1.ResumeLayout() End Sub