受信側のコード
受信側のコードは簡単です。
.NETでは簡単にFormに送られてくるメッセージをフックできます。
それにはFormクラスのWndProcメソッドを自分のフォームでオーバーライドすればよいのです。
あとはメッセージの種類により数値データか文字データかを判断して、数値データであれば、
そのまま文字にして表示ます。
文字列の場合は、WinProcには引数としてSystem.Windows.Forms.Message構造体が参照で渡されてきます。
この参照データからMessage構造体が持つGetLParamメソドでLParamを取得し、
「OPYDATASTRUCT」でキャストして文字列を取り出します。
仕様
フォームの構造は簡単で、送られたデータを表示するだけです。
C# 全てのコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace getmessagec
{
public partial class FomGetMessage : Form
{
//COPYDATASTRUCT構造体
public struct COPYDATASTRUCT
{
public Int32 dwData; //送信する32ビット値
public Int32 cbData; //lpDataのバイト数
public string lpData; //送信するデータへのポインタ(0も可能)
}
public const int WM_COPYDATA = 0x4A;
public const int WM_USER = 0x400;
public FomGetMessage()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_USER:
//数値が送信されて来た
txtInt1.Text = m.WParam.ToString();
txtInt2.Text = m.LParam.ToString();
break;
case WM_COPYDATA:
//文字が送信されて来た
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
txtMessage.Text = mystr.lpData ;
break;
}
base.WndProc(ref m);
}
//テキストボックスのクリア
private void butCls_Click(object sender, EventArgs e)
{
txtMessage.Text = string.Empty;
txtInt1.Text = string.Empty;
txtInt2.Text = string.Empty;
}
}
}
VB.NET 全てのコード
Public Class FomGetMessage
'COPYDATASTRUCT構造体
Public Structure COPYDATASTRUCT
Public dwData As IntPtr '送信するビット値
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
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_USER
'数値が送信されて来た
txtInt1.Text = m.WParam.ToString()
txtInt2.Text = m.LParam.ToString()
Case WM_COPYDATA
'文字が送信されて来た
Dim mystr As COPYDATASTRUCT = New COPYDATASTRUCT()
Dim mytype As Type = mystr.GetType()
mystr = CType(m.GetLParam(mytype), COPYDATASTRUCT)
txtMessage.Text = mystr.lpData
End Select
MyBase.WndProc(m)
End Sub
'テキストボックスのクリア
Private Sub butCls_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles butCls.Click
txtMessage.Text = String.Empty
txtInt1.Text = String.Empty
txtInt2.Text = String.Empty
End Sub
End Class
|