前回は共有メモリを使ったプロセス間でのデータの受け渡しをしてみましたが、
プロセス間でのデータの送受信には、
ウィンドウメッセージによる方法もあります。
以前にもポストメッセージの送信を、
ちょこっと試しましたが、今度は受信側もやってみます。
メッセージを受信するには、
・BEGIN_MESSAGE_MAP
・END_MESSAGE_MAP
・MESSAGE_HANDLER
という、3つのマクロを使用します。
BEGIN_MESSAGE_MAPとEND_MESSAGE_MAPで、MESSAGE_HANDLERを囲むように記述します。
MESSAGE_HANDLERの引数は、ウィンドウメッセージの値、メッセージの中身、イベント用関数となります。
ま、とにかく試してみる。
今回も、送信側と受信側の2つの.exeを作成します。
←Send.exe(送信側)のフォームはこんな感じです。
送信ボタンを押すと
エディットボックスの値を数値にして送信します。
←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 [ウィンドウのタイトルからハンドルを取得する]