您的位置:首页 > 其它

BCB 如何实现在不同的程序间发送和响应自定义消息?

2011-09-20 18:02 603 查看
在两个或者说多个应用程序之间使用某个应用程序中定义的消息,那么应将这个消息进行注册,使之成为Windows消息(当然要保证其唯一性),使用RegisterWindowMessage进行注册,下面是两个应用程序(也就是说是两个.exe,不要误解成两个Form).
Application 1:
.h File
class TForm1:public TForm
{
private:

public:

protected:
...........
}
.cpp File
//I omit the constructor
void __fastcall TForm1::FormCreate(TObject *Sender)
{
UINT uMsg=::RegisterWindowMessage( "WM_MYMESSAGE ");
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hWnd=::FindWindow(NULL, "Form2 ");
if(hWnd) ::SendMessage(hWnd,uMsg,0,0);
}

Application 2:
class TForm2:public TForm
{
private:
....
public:
.....
protected:
virtual void __fastcall WndProc(TMessage &Message);
};
.cpp File
//I omit all other functions and only write the window procedure
void __fastcall TForm2::WndProc(TMessage &Message)
{
if(Message.Msg==uMsg)
{
ShowMessage( "I received the message defined in application1 ");
.....................
}
TForm::WndProc(Message);
}

还有一种方法可以实现在两个进程间通讯,那就是使用WM_COPYDATA消息,在这里也给出代码:
发送方:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
COPYDATASTRUCT cds;

AnsiString Data=Edit2-> Text;// "Just a test ";

cds.dwData=sizeof(COPYDATASTRUCT);
cds.cbData=Data.Length();
cds.lpData=(LPVOID)Data.c_str();

HWND hWnd=::FindWindow(NULL, "接收方窗口的标题 ");
if(hWnd) ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cds);

//向目标窗口发消息WM_COPYDATA
SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
}
接收方:
void __fastcall TForm2::WndProc(TMessag &Message)
{
if(Message.Msg==WM_COPYDATA)
{
COPYDATASTRUCT *cds;
char* DataBuf;

cds=(COPYDATASTRUCT*)Message.LParam;
DataBuf=new char[cds-> cbData];
CopyMemory(DataBuf,cds-> lpData,cds-> cbData);

AnsiString Str=AnsiString(DataBuf);
Memo1-> Lines-> Add( "Str= "+Str);

delete[] DataBuf;
}
TForm::WndProc(Message);
}

总结一下:

发送WM_COPYDATA消息只能用SendMessage而不能用PostMessage,原因是WM_COPYDATA发送的数据是以内存映射文件形式发送的,用PostMessage后内存映射文件的句柄就无失效了,会造成数据丢失。

被传递的数据中不能带有对象的指针或引用之类的指针型数据,否则这些数据不会被接收应用程序获取到。

被传递的数据在传递过程中,它不能被发送应用程序修改。

接收方认为被传递的数据是只读的,lParam只在消息处理函数中可见,因此接收应用程序不应该释放lParam所占用的程序空间。如果接收应用程序需要在消息处理函数返回后再对传递的数据有处理,可以把传递数据复制到本地的缓冲区中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐