SendMessage 自定义消息函数

本文介绍了一个简单的自定义消息处理机制,在MFC框架下通过在.h文件中定义自定义消息及处理函数声明,并在.cpp文件中实现消息处理逻辑,展示了如何发送自定义消息并更新界面元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/wqj1212/archive/2008/03/03/1089298.html


在.h文件里
#define WM_MYMSG  WM_USER + 1 // 自定义一个消息
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // 自定义消息的处理函数声明

在.cpp文件里
ON_MESSAGE(WM_MYMSG, OnMyMessage) // 在 MESSAGE_MAP 中间添加, 利用 ON_MESSAGE() 宏在自定义消息与其处理函数间建立映射关系

LRESULT CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {
    CString *str;
    str=(CString *)lParam;
    SetDlgItemText(IDC_EDIT,*str);
    return 0;
}

void CModelessDlg::OnMsgBTN() {
    CString str= "自定义消息被触发了!";
    SendMessage(WM_MYMSG, 0, (LPARAM) &str); // 给ModelessDlg自己发一个自定义的消息

}


<think>好的,用户问的是关于SendMessage自定义消息传递一个数字参数的问题。首先,我需要回忆一下Windows编程中SendMessage的使用方法。SendMessage函数用于向窗口发送消息,参数包括窗口句柄、消息标识符、wParam和lParam。 用户提到的是自定义消息,所以首先需要确定如何定义自定义消息。通常,WM_USER常量以上的消息ID是留给应用程序使用的,比如WM_USER + 0x100。定义消息时需要使用RegisterWindowMessage或者直接使用WM_USER加上一个偏移值,但RegisterWindowMessage更安全,避免冲突。 接下来是传递数字参数的问题。SendMessage的wParam和lParam参数都是指针类型的,但在实际使用中,可以将整数值直接转换为WPARAM或LPARAM。如果数字较小,比如在32位系统中,可以直接用wParam传递。如果数字较大或者是64位的,可能需要拆分成高位和低位,分别放在wParam和lParam中,或者使用指针传递。 然后需要考虑接收消息的窗口如何处理。窗口过程需要捕获自定义消息,并从wParam或lParam中提取数值。例如,在消息处理函数中,将wParam转换为整型。 另外,跨进程发送消息时,如果传递的是指针,需要注意内存地址空间的问题。这时候可能需要使用共享内存或者其他进程间通信方法,但如果是传递简单的整数值,直接传递应该没问题。 用户可能遇到的常见问题包括消息未正确注册、参数转换错误或者接收端没有正确处理消息。需要提醒用户检查消息ID是否正确,参数是否在接收端被正确解析,以及是否在正确的窗口上发送消息。 总结步骤应该是:定义自定义消息,发送时转换参数,接收端解析参数。同时,提供示例代码会更清楚,比如定义消息、发送消息、处理消息的部分。还要注意不同平台(32位和64位)下参数大小的差异,确保类型转换正确。</think>在Windows编程中,使用`SendMessage`发送自定义消息传递数字参数的实现步骤如下: ### 一、定义自定义消息 ```cpp #define WM_MYCUSTOM_MSG (WM_USER + 0x100) // WM_USER是Windows预留的用户消息基准值(0x0400) // 推荐用RegisterWindowMessage注册唯一消息名(跨进程更安全) ``` ### 二、发送消息时的参数传递 ```cpp // 假设要传递整型数值 int nValue = 12345; ::SendMessage(hTargetWnd, WM_MYCUSTOM_MSG, (WPARAM)nValue, 0); // 如果传递64位数字: __int64 bigValue = 0x123456789ABCDEF0; ::SendMessage(hTargetWnd, WM_MYCUSTOM_MSG, (WPARAM)(bigValue & 0xFFFFFFFF), // 低32位 (LPARAM)(bigValue >> 32)); // 高32位 ``` ### 三、接收消息处理 ```cpp // 在窗口过程函数中处理 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MYCUSTOM_MSG: { int receivedValue = (int)wParam; // 接收32位数值 // 如果是64位数值: __int64 bigValue = ((__int64)lParam << 32) | (__int64)wParam; return 0; } //...其他消息处理 } } ``` ### 四、关键注意事项 1. **参数范围限制**: - 在32位系统中,`WPARAM`和`LPARAM`都是4字节 - 在64位系统中,`WPARAM`是4字节,`LPARAM`是8字节 - 需要根据位数选择参数传递方式 2. **跨进程传递指针**: ```cpp // 错误做法(直接传本地指针): int* p = new int(100); ::SendMessage(hOtherProcessWnd, WM_MSG, (WPARAM)p, 0); // 会访问非法内存! // 正确做法(使用共享内存或复制数据): COPYDATASTRUCT cds; cds.dwData = 0; cds.cbData = sizeof(int); cds.lpData = p; ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cds); ``` 3. **调试技巧**: - 使用`GetLastError()`检查发送失败 - 使用`Spy++`工具监视消息流 - 在消息处理函数中设置断点 ### 五、应用场景示例 1. 跨线程更新UI进度条数值 2. 通知子窗口当前缩放比例 3. 传递传感器采集的实时数据 4. 多文档应用中同步视图参数 建议始终用`MAKEWPARAM`/`MAKELPARAM`宏处理参数组合,并通过`HIWORD`/`LOWORD`宏安全解包参数,这样可以避免直接类型转换的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值