带有自定义参数的Sendmessage /postmessage
sendmessage/postmessage with custom parameters
我想在MFC中有一个消息处理程序,它接受我在消息映射中定义的任何参数。
例如,static UINT UWM_STATUS_MSG = RegisterWindowMessage("Status message");
static UINT UWM_GOT_RESULT= RegisterWindowMessage("Result has been obtained");
//{{AFX_MSG(MyClass)
afx_msg void OnCustomStringMessage(LPCTSTR);
afx_msg void OnStatusMessage();
//}}AFX_MSG
BEGIN_MESSAGE_MAP(MyClass, CDialog)
//{{AFX_MSG_MAP(MyClass)
ON_REGISTERED_MESSAGE(UWM_STATUS_MSG, OnStatusMessage)
ON_REGISTERED_MESSAGE(UWM_GOT_RESULT, OnCustomStringMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void MyClass::OnCustomStringMessage(LPCTSTR result)
{
m_result.SetWindowText(result);
}
void MyClass::OnStatusMessage()
{
// Do something
}
DWORD WINAPI MyClass::thread(LPVOID lParam)
{
char result[256] = { 0 };
SendMessage(UWM_STATUS_MSG);
// Do some stuff and store the result
PostMessage(UWM_GOT_RESULT, result);
}
这种事可能吗?
通过ON_MESSAGE或ON_REGISTERED_MESSAGE调用的成员函数的签名必须为:
afx_msg LRESULT OnMyFunction(WPARAM p1, LPARAM p2);
必须使用强制转换操作符来处理。
所以你应该这样写:
...
afx_msg LRESULT OnCustomStringMessage(WPARAM p1, LPARAM p2);
...
LRESULT MyClass::OnCustomStringMessage(WPARAM p1, LPARAM p2)
{
LPCTSTR result = (LPCTSTR)p1 ;
m_result.SetWindowText(result);
}
DWORD WINAPI MyClass::thread(LPVOID lParam)
{
static char result[256] = { 0 }; // we need a static here
// (see explanations from previous answers)
SendMessage(UWM_STATUS_MSG);
// Do some stuff and store the result
PostMessage(UWM_GOT_RESULT, (WPARAM)result);
}
如果MyClass::thread意味着从几个不同的线程调用,你需要处理结果数组在一个更编译的方式,只是声明它是静态的,例如在MyClass::thread中分配数组,并在OnCustomStringMessage中删除它,如user2173190的答案所建议的
尝试使用WM_USER消息作为您的自定义消息,并通过覆盖它在OnMessage方法中处理它。要了解WM_USER消息,请参阅此处
如果您发送WM_USER以下范围的消息给异步消息函数(PostMessage, SendNotifyMessage和SendMessageCallback),其消息参数不能包含指针。否则,操作将失败。函数将在接收线程有机会处理消息之前返回,并且发送方将在使用内存之前释放内存。
PostMessage的消息参数可以包含指针可以包括指针作为参数。将它们转换为整数,不要在触发PostMessage的线程或函数中释放或释放它们,而是在接收它们的线程或函数中释放或释放它们。只要确保在使用指针时,对一条消息只使用一种指针类型,不要在同一消息中混合使用指向不同对象的指针。
http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644944 (v = vs.85) . aspx
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 将卡诺地图简化器从 SOP 更改为 POS 结果
- SendMessage 使用 RegisterWindowMessage API 失败
- QT 事件过滤器 mouseEvent->pos().x() 始终为零,但 mouseEvent->pos().y() 工作正常
- 尝试使用QNetworkAccessManager get()而不是QNetworkAccess Manager pos
- 我可以在 SDL 窗口外跟踪我的鼠标 pos 吗?
- 为什么字符串(常量字符* s,size_t pos,size_t len = npos)有效?
- 为什么 gl_FragCoord.z 与 ((pos.z / pos.w) + 1.0) * 0.5 不同?
- 获取使用 Qt c++ 在 Linux 中通过 USB 连接的 ESC/POS 打印机的状态
- “POS”未在此范围内声明
- 消息映射如何与 SendMessage() 方法交互?
- 在 POS 打印机上打印条形码字体
- 变量'pos'正在使用未初始化
- 如何实现 std::map::查找包含两个结构'Pos'结构的比较逻辑,每个结构包含 x 和 y 坐标
- forward_list::splice_after( const_iterator pos, forward_list&other, const_iterator i ) 功能
- WinApi消息循环,Postmessage的工作原理与SendMessage类似
- Sendmessage在方法定义内部无法正常工作
- 如何在 c++ 中从 SendMessage() 接收信息
- 提前钻头操纵,在任何POS中留下空位
- seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios