发送消息 MFC 消息映射
1、在用WIN 32 API函数开发应用程序时,经常要用SendMassege函数向某些对象发送消息,以让对象实现某些功能(此时也有相应的API
函数来实现这个功能)。例如关闭窗口,可以发送WM_CLOSE消息。
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//关闭主窗口
SendMessage(hwnd,WM_CLOSE,0,0);//关闭普通窗口
2、示例1--发送WM_COPYDATA消息(即WM_COPYDATA消息在两个进程之间的传递)
在做这个例子之前,我们先了解一下,WM_COPYDATA消息对应的结构体COPYDATASTRUCT
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//接收数据的句柄
DWORD cbData;//数据的大小
PVOID lpData;//数据指针
}COPYDATASTRUCT;
主程序端:
建立MFC对话框工程,添加编辑框和一个按钮
在按钮单击事件函数中添加后:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow(NULL,"接受窗口");//找到我们要发送消息的窗口句柄
if(hwnd==NULL)
{
AfxMessageBox("没有找到接受窗口");
return;
}
CString msgedit; //声明我们要发送的消息
GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);//获得编辑框内容,赋给msgedit
COPYDATASTRUCT data={0}; //初始化COPYDATASTRUCT结构体对象
data.dwData=(DWORD)this->GetSafeHwnd(); //接收数据的句柄
data.cbData=msgedit.GetLength(); //数据的大小
data.lpData=msgedit.GetBuffer(msgedit.GetLength()); //数据指针
::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);//发送消息
}
接收窗口:
建立MFC对话框工程,添加编辑框
为对话框添加一个WM_COPYDATA消息响应
编辑代码过后如下:
BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
//函数接口包括:窗口句柄和COPYDATASTRUCT结构体指针,分别对应WPARAM,LPARAM
{
// TODO: Add your message handler code here and/or call default
char msgdata[256];//声明接受的消息
DWORD size= pCopyDataStruct->cbData; //数据大小
CopyMemory(msgdata,pCopyDataStruct->lpData,size);//通过数据指针,复制内容
msgdata[size]='\0'; //给数组添加结束标志
GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);//给编辑框设置内容
return CDialog::OnCopyData(pWnd, pCopyDataStruct);//返回是否成功
}
3、示例2--发送自己注册的消息
本示例先通过RegisterWindowMessage函数来注册一条消息,然后用Win32 API函数SendMessage()发送。
主程序端:
建立MFC对话框,添加一个按钮
在对话框CPP文件预处理下加入下面代码:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注册一条发送MESSAGE的自己注册的消息
在按钮单击事件函数中添加后:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HWND hwnd=::FindWindow(NULL,"接受窗口");//找到我们要发送消息的窗口句柄
if(hwnd==NULL)
{
AfxMessageBox("没有找到接受窗口");
return;
}
else
::SendMessage(hwnd,WM_RGSMSG,1,0);//发送消息
}
本示例接受方,仍然是先通过RegisterWindowMessage函数来注册一条相同的消息,然后定义消息宏,绑定处理函数
接收窗口:
建立MFC对话框工程
在对话框CPP文件预处理下加入下面代码:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注册一条发送MESSAGE的自己注册的消息
在消息宏声明处
将消息声明为:
afx_msg LRESULT OnRgsmsg(WPARAM wParam,LPARAM lparam); //声明消息映射函数
在建立消息映射表的地方添加如下代码:
ON_REGISTERED_MESSAGE(WM_RGSMSG,OnRgsmsg)//注册的消息宏应放在这个位置
在CPP文件中,添加函数定义,代码如下:
LRESULT CMyDlg::OnRgsmsg(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("接收到消息");
return TRUE;
}