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所占用的程序空间。如果接收应用程序需要在消息处理函数返回后再对传递的数据有处理,可以把传递数据复制到本地的缓冲区中。
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所占用的程序空间。如果接收应用程序需要在消息处理函数返回后再对传递的数据有处理,可以把传递数据复制到本地的缓冲区中。
相关文章推荐
- MFC程序中如何实现自定义消息
- MFC中不同对话框间使用SendMessage发送自定义消息的具体实现
- vc自定义消息的发送与接收的方法实现
- C++控制台程序,windows环境下响应按键消息实现一
- MFC 自定义消息实现与响应
- vc如何自定义消息与在线程中向主窗体控件发送数据
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
- vc自定义消息的发送与接收的方法实现
- VC++6.0中如何发送自定义消息
- windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何添加自定义Task,如何让程序的一部分拥有不同的执行周期
- 在两个不同的程序实例中发送消息,相互通信
- vc自定义消息的发送与接收的方法实现
- MFC 自定义消息实现与响应
- VC中如何实现自定义消息
- 在java程序中如何能获取到另一个程序的windows句柄,又如何使用这个句柄向这个窗口发送消息
- (菜鸟级)长时间的程序运行,如何发送消息,提升用户体验
- C# 如何实现带消息数的程序桌面图标
- JAVA微信开发:如何实现主动发送微信消息
- 发现Windows程序 最主要的还是要理解消息和窗口的相互调用,相互影响是如何实现的,才能更准确的去理解Windows程序,去编好自己想要的程序功能