1.自定义消息
// 21.8.1(OK) #define WM_MY_MESSAGE WM_USER + 66 // 自定义消息 void CMessageSendSampleDlg::OnButtonSendMymessage() // 发送自定义消息函数 { SendMessage(WM_MY_MESSAGE, NULL, NULL); // 发送自定义消息 } LRESULT CMessageSendSampleDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) // 程序处理函数 { switch (message) // 判断消息类型 { case WM_MY_MESSAGE: WriteLog("接收到WM_MY_MESSAGE消息"); // 接收到用户自定义消息,输出 break; default: break; } return CDialog::WindowProc(message, wParam, lParam); }
2.注册消息
发送
void CMessageSendSampleDlg::OnButtonRegmessage() // 注册消息函数 { UINT myMsg = RegisterWindowMessage("LLN's Message Test"); // 注册消息 ::SendMessage(HWND_BROADCAST, myMsg, NULL, NULL); // 发送广播消息 }
接收
BOOL CMessageReceiveSampleDlg::OnInitDialog() { ... myMsg = RegisterWindowMessage("LLN's Message Test"); ... } LRESULT CMessageReceiveSampleDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == myMsg) WriteLog("接收到使用RegisterWindowMessage函数注册的消息"); return CDialog::WindowProc(message, wParam, lParam); }
3.PostMessage()函数与SendMessage()函数的区别
LRESULT SendMessage/ PostMessage(HWND hWnd,//指定接收消息的对话框的句柄
UINT Msg,//指定发送的消息类型
WPARAM wParam,//消息参数
LPARAM lParam);//消息参数
wParam=(WPARAM) (HWND)hwnd;//发送对话框句柄
lParam=(LPARAM) ( PCOPYDATASTRUCT) pcds;//结构数据指针
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//指定发送给接收程序的32位数据
DWORD cbData;//指定lpData参数中指定的数据的长度
PVOID lpData;//指向要传递的数据的指针
} PCOPYDATASTRUCT;
发送
struct MESCONTENT // 消息内容结构 { char sender[50]; // 消息发送者 char content[500]; // 消息内容 }; void CMessageSendSampleDlg::OnButtonSendCopydata() // 通过WM_COPYDATA消息发送数据 { UpdateData(TRUE); // 获取发送数据 CWnd *pWnd=CWnd::FindWindow(NULL, _T("接收WM_COPYDATA消息测试")); // 获取接收对话框 if(pWnd==NULL) // 如果没有检索到接收对话框,则 { WriteLog("接收消息数据的进程未运行"); // 输出错误信息,并 return; // 返回 } MESCONTENT msData={0}; // 定义消息结构变量 strcpy(msData.sender, m_sender.GetBuffer(50)); // 赋值消息发送者 strcpy(msData.content,m_content.GetBuffer(500)); // 赋值消息内容 COPYDATASTRUCT cpd; // 定义发送结构变量 cpd.dwData = 0; // 发送整数值为0 cpd.cbData = sizeof(msData); // 发送数据的长度 cpd.lpData = &msData; // 发送数据内容 pWnd->SendMessage(WM_COPYDATA, NULL, (LPARAM)&cpd); // 发送WM_COPYDATA消息 }
接收
struct MESCONTENT // 消息内容结构 { char sender[50]; // 消息发送者 char content[500]; // 消息内容 }; BOOL CMessageReceiveSampleDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) // WM_COPYDATA消息处理函数 { MESCONTENT* msData = (MESCONTENT*)pCopyDataStruct->lpData; // 获取消息数据 // 输出消息数据 WriteLog("接收到WM_COPYDATA消息。\r\n发送者=%s;\r\n内容=%s", msData->sender, msData->content); return CDialog::OnCopyData(pWnd, pCopyDataStruct); // 调用基类处理函数 }