BCB Client

- C++ Builderを用いたWindowsプログラミングメモ -

MESSAGE_HANDLER [メッセージの送受信]

前回は共有メモリを使ったプロセス間でのデータの受け渡しをしてみましたが、
プロセス間でのデータの送受信には、
ウィンドウメッセージによる方法もあります。

以前にもポストメッセージの送信を、
ちょこっと試しましたが、今度は受信側もやってみます。

メッセージを受信するには、
・BEGIN_MESSAGE_MAP
・END_MESSAGE_MAP
・MESSAGE_HANDLER
という、3つのマクロを使用します。

BEGIN_MESSAGE_MAPとEND_MESSAGE_MAPで、MESSAGE_HANDLERを囲むように記述します。
MESSAGE_HANDLERの引数は、ウィンドウメッセージの値、メッセージの中身、イベント用関数となります。

ま、とにかく試してみる。
今回も、送信側と受信側の2つの.exeを作成します。


receive_postmessage_01.png

 ←Send.exe(送信側)のフォームはこんな感じです。
  送信ボタンを押すと
  エディットボックスの値を数値にして送信します。




receive_postmessage_02.png

 ←Receive.exe(受信側)のフォームはこんな感じです。
  メッセージハンドラで、メッセージが来るのを
  ず〜っと待ってる状態です。







<Send.exe(送信側) | Unit1.h>
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE 管理のコンポーネント
	TEdit *Edit1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


<Send.exe(送信側) | Unit1.cpp>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 送信ボタン
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// 送信したいアプリのタイトルを設定します
	AnsiString AppTitle = "受信側";

	// アプリのタイトルからウィンドウハンドルを取得します
	HWND hwnd = FindWindow(NULL, AppTitle.c_str());

	// LParamに数値を入れてポストメッセージ送信
	PostMessage(hwnd, WM_USER+100, 0, StrToInt(Edit1->Text));
}
//---------------------------------------------------------------------------




<Receive.exe(受信側) | Unit1.h>
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE 管理のコンポーネント
	TEdit *Edit1;
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);

	// メッセージ受信イベント用
	void __fastcall WMReceive(TMessage msg);
//---------------------------------------------------------------------------
// メッセージハンドラ
BEGIN_MESSAGE_MAP
	MESSAGE_HANDLER(WM_USER+100, TMessage, WMReceive);
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


<Receive.exe(受信側) | Unit1.cpp>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// メッセージ受信イベント
void __fastcall TForm1::WMReceive(TMessage msg)
{
	// 受信したLParamの値を表示
	Edit1->Text = IntToStr(msg.LParam);
}
//---------------------------------------------------------------------------



まず、送信.exeと受信.exeを起動して、送信.exeから
[WM_USER+100]というウィンドウメッセージのLParamに[777]という中身で送信します。

すると、受信.exeでウィンドウメッセージを受信し、WMReceiveイベントが呼ばれます。
その後、メッセージのLParamから中身を取り出しています。


※参考
FindWindow [ウィンドウのタイトルからハンドルを取得する]


[ トップ | 一覧 | 前へ | 次へ ]

  • トップ
  • 一覧
  • リンク
  • 掲示板

Copyright © BCB Client. All Rights Reserved. Template by ネットマニア