|
プロセス間通信(SendMessage)
|
SendMessageによるプロセス間通信(送信側)
VB.NETのコード
Imports System.Runtime.InteropServices
Public Class FomSendMessage
'COPYDATASTRUCT構造体
Public Structure COPYDATASTRUCT
Public dwData As Int32 '送信するビット値
Public cbData As Int32 'lpDataのバイト数
Public lpData As String '送信するデータへのポインタ(0も可能)
End Structure
Public Const WM_COPYDATA As Int32 = &H4A
Public Const WM_USER As Int32 = &H400
"user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
"user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function SendMessage( _
ByVal hWnd As IntPtr, _
ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByVal lParam As Int32) As Integer
End Function
"user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function SendMessage( _
ByVal hWnd As IntPtr, _
ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByRef lParam As COPYDATASTRUCT) As Integer
End Function
'送信ボタン押下
Private Sub butSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butSend.Click
Dim result As Int32 = 0
'相手のウィンドウハンドルを取得します
Dim hWnd As Int32 = FindWindow(Nothing, txtName.Text)
If hWnd = 0 Then
'ハンドルが取得できなかった
MessageBox.Show("相手Windowのハンドルが取得できません")
Return
End If
'文字列メッセージを送信します
If txtMessage.Text <> String.Empty Then
'送信データをByte配列に格納
Dim bytearry() As Byte = System.Text.Encoding.Default.GetBytes(txtMessage.Text)
Dim len As Int32 = bytearry.Length
Dim cds As COPYDATASTRUCT
cds.dwData = 0 '使用しない
cds.lpData = txtMessage.Text 'テキストのポインターをセット
cds.cbData = len + 1 '長さをセット
'文字列を送る
result = SendMessage(hWnd, WM_COPYDATA, 0, cds)
End If
'数値メッセージを送信します
If txtInt1.Text <> String.Empty And txtInt2.Text <> String.Empty Then
Dim int1 As Int32 = 0
Dim int2 As Int32 = 0
Try
'数値に正しく変換出来るか?
int1 = CType(txtInt1.Text, Int32)
int2 = CType(txtInt2.Text, Int32)
Catch
MessageBox.Show("入力された数値が正しく有りません")
Return
End Try
'数値を送る
result = SendMessage(hWnd, WM_USER, int1, int2)
End If
End Sub
End Class