当前线程为主线程,我想用PostThreadMessage 给当前线程(主线程)发送消息,没有反映这是为什么呀?
ON_THREAD_MESSAGE(20000,ThreadFunction)PostThreadMessage(GetCurrentThreadId(),20000,0...
ON_THREAD_MESSAGE(20000,ThreadFunction)
PostThreadMessage(GetCurrentThreadId(),20000,0,0);
这样发也不行啊,这是为什么呀?请高手指点一二啊,不胜感激!
晓凡_C:谢谢你的回答,我的意思是当前线程就是主线程(并没有创建子线程),在主线程里用PostThreadMessage给主线程发消息(注意:不用SendMessage和PostMessage),是不是可以啊?
回复 春光闪烁:谢谢你的回答
1.主线程是MFC的,不是自己写的。
2.ON_THREAD_MESSAGE映射函数不是在CWinThread派生类中定义的,就是一个自己定义的消息映射函数,所以收不到消息。(这一点我知道了,谢谢!)
还有一个问题: 我现在就是想用PostThreadMessage在主线程里发送自定义的消息给当前线程(主线程),用ON_MESSAGE(20000,ThreadFunction)是不是应该行啊,但是我试了试,这样不行,这是为什么呀?是不是因为用PostThreadMessage发送的消息必须用ON_THREAD_MESSAGE宏来映射啊? 展开
PostThreadMessage(GetCurrentThreadId(),20000,0,0);
这样发也不行啊,这是为什么呀?请高手指点一二啊,不胜感激!
晓凡_C:谢谢你的回答,我的意思是当前线程就是主线程(并没有创建子线程),在主线程里用PostThreadMessage给主线程发消息(注意:不用SendMessage和PostMessage),是不是可以啊?
回复 春光闪烁:谢谢你的回答
1.主线程是MFC的,不是自己写的。
2.ON_THREAD_MESSAGE映射函数不是在CWinThread派生类中定义的,就是一个自己定义的消息映射函数,所以收不到消息。(这一点我知道了,谢谢!)
还有一个问题: 我现在就是想用PostThreadMessage在主线程里发送自定义的消息给当前线程(主线程),用ON_MESSAGE(20000,ThreadFunction)是不是应该行啊,但是我试了试,这样不行,这是为什么呀?是不是因为用PostThreadMessage发送的消息必须用ON_THREAD_MESSAGE宏来映射啊? 展开
展开全部
有两种可能
1. 你主线程如果不是MFC的(即自己怎么写的), 可能基本没有机会处理这个消息, 因为PostThreadMessage是立即返回
2. 关于宏ON_THREAD_MESSAGE MSDN里面有介绍
memberFxn
The name of the CWinThread-message-handler function to which the message is mapped.
不知道你这个函数是不是在CWinThread派生类写的
我在MFC的对话框中添加一个按钮, 处理按钮的单击事件如下
if (PostThreadMessage(GetCurrentThreadId(), WM_QUIT,0,0) == FALSE)
{
AfxMessageBox(_T("失败"));
return;
}
点击按钮之后, 程序会自动退出, 说明主线程有收到WM_QUIT消息
补充回答:
具体的我也不太清楚, 不过MSDN里面有说(关于PostThreadMessage)
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function.
因此我猜测可能是DispatchMessage 没有办法转发, 如果是跟窗口关联的可以通过ID获取HWND, 再使用PostMessage发送消息
所以我在PreTranslateMessage捕捉, 发现可以捕捉到消息
具体示例:
1. 在点击事件中
if (PostThreadMessage(GetCurrentThreadId(), 0x0401,0,0) == FALSE)
{
AfxMessageBox(_T("失败"));
return;
}
2. 在虚函数PreTranslateMessage中
添加(在return CDialog::PreTranslateMessage(pMsg);前面添加)
if (pMsg->message == 0x0401)
{
AfxMessageBox(_T("收到消息 "));
}
1. 你主线程如果不是MFC的(即自己怎么写的), 可能基本没有机会处理这个消息, 因为PostThreadMessage是立即返回
2. 关于宏ON_THREAD_MESSAGE MSDN里面有介绍
memberFxn
The name of the CWinThread-message-handler function to which the message is mapped.
不知道你这个函数是不是在CWinThread派生类写的
我在MFC的对话框中添加一个按钮, 处理按钮的单击事件如下
if (PostThreadMessage(GetCurrentThreadId(), WM_QUIT,0,0) == FALSE)
{
AfxMessageBox(_T("失败"));
return;
}
点击按钮之后, 程序会自动退出, 说明主线程有收到WM_QUIT消息
补充回答:
具体的我也不太清楚, 不过MSDN里面有说(关于PostThreadMessage)
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function.
因此我猜测可能是DispatchMessage 没有办法转发, 如果是跟窗口关联的可以通过ID获取HWND, 再使用PostMessage发送消息
所以我在PreTranslateMessage捕捉, 发现可以捕捉到消息
具体示例:
1. 在点击事件中
if (PostThreadMessage(GetCurrentThreadId(), 0x0401,0,0) == FALSE)
{
AfxMessageBox(_T("失败"));
return;
}
2. 在虚函数PreTranslateMessage中
添加(在return CDialog::PreTranslateMessage(pMsg);前面添加)
if (pMsg->message == 0x0401)
{
AfxMessageBox(_T("收到消息 "));
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询