一、在用WIN 32 API函数开发应用程序时,常常要用SendMassege函数向某些对象发送消息,以让对象实现某些功能(此时也有相应的API数组
函数来实现这个功能)。例如关闭窗口,能够发送WM_CLOSE消息。
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//关闭主窗口
SendMessage(hwnd,WM_CLOSE,0,0);//关闭普通窗口
二、示例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);//发送消息
}this
接收窗口:
创建MFC对话框工程,添加编辑框
为对话框添加一个WM_COPYDATA消息响应
编辑代码事后以下:spa
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);//返回是否成功
}
三、示例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;
}code