前回は、SendMessageで Formに Msg、wpram,lparamの3つの値を送信しました。
今回は、構造体を送信する方法です。
今回も、win32の資産を使います。
コンパイルには、usr32.lib のリンカ設定が必要です。
構造体を送信するには、Messageに
WM_COPYDATA
を使用し
lparamに、COPYDATASTRUCT型の構造体アドレスで送信するデータを設定する必要があります。
また、構造体を送信するMessageに非同期のMessage(PostMessageなど)は使用できません。
(いつメモリを解放して良いかわからないため。だそうです。)
例は、以下の構造体を button1 が押されたら param1=123、param="456"を設定し、自分のFormにMessageを送信して、受信したら
param1とparam2をそれぞれ、TextBox1、TextBox2に反映する例です。
typedef struct _msg_data {
int param1;
TCHAR param2[10];
}MSG_DATA;
#include <windows.h>
// sendする構造体
typedef struct _msg_data {
int param1;
TCHAR param2[10];
}MSG_DATA;
namespace SendMsgStruct {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}
:<略>
protected:
virtual void WndProc( Message% m ) override
{
MSG_DATA *msg_data;
switch(m.Msg) {
// 受信した構造体データをTextBoxに反映
case WM_COPYDATA:
msg_data = (MSG_DATA *)m.LParam.ToPointer();
textBox1->Text = msg_data->param1.ToString();
textBox2->Text = gcnew String(msg_data->param2);
break;
default:
break;
}
Form::WndProc(m); //ここで見ているcase以外の標準処理をここでさせる。
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
HWND myh;
MSG_DATA msg_data;
COPYDATASTRUCT data;
TCHAR tc_buf[64];
data.lpData = &msg_data; // 送信する構造体アドレス設定
data.cbData = sizeof(msg_data); // サイズ指定
msg_data.param1 = 123;
wcscpy_s(msg_data.param2, L"456");
// 自Formへ送信
wcscpy_s(tc_buf, L"Form1");
myh = FindWindow(NULL, tc_buf);
::SendMessage(myh, WM_COPYDATA, (WPARAM)0x0000, (LPARAM)&msg_data);
}
};
}
(WindowsアプリケーションForm (Framework3.5) VS2008 VC++環境でのお話しです。)