SendMessage函数将指定的消息发送到一个或多个窗口,消息会直接发送到窗口过程而不经过消息队列,且直到消息处理完成后,SendMessage才返回。函数返回值指定消息处理的结果,依赖于所发送的消息。函数原型:
LRESULT WINAPI SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
); <span style="font-size:14px;">
</span>
hWnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:要发送的消息。
wParam:消息的附加信息。
IParam:消息的附加信息
有穿过消息队列的消息才能被虚函数PreTranslateMessage()截获,故采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息不会被PreTranslateMessage()截获。
PostMessage函数将一个消息放入(寄送)到与指定窗口创建的线程相关联的消息队列里,不等待线程处理消息就立刻返回。消息队列里的消息通过调用GetMessage或PeekMessage取得。函数执行成功返回非0,否则返回0。函数参数意义与SendMessage相同。
|
|
|
对于接收消息的窗口,有两种处理消息的方法:
1、重写PreTranslateMessage来截获消息,只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。
2、添加以下代码来处理自定义消息:
①、自定义消息ID:
#define WM_MY_MESSAGE(WM_USER + 100)
②、添加消息处理函数:
protected:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)
{
......
}
③、映射消息ID和消息处理函数:
BEGIN_MESSAGE_MAP(CMFCApplication17Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CMFCApplication17Dlg::OnBnClickedOk)
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) //映射消息ID和消息处理函数
END_MESSAGE_MAP()
BOOL WINAPI PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
从以上两个函数的功能可以看出SendMessage与PostMessage最大的区别有两点:1、SendMessage发送的消息不会进队而PostMessage发送的消息会进队。2、SendMessage属于阻塞函数,PostMessage属于非阻塞函数。3、如果需要等消息处理完后才进入下一流程则使用SendMessage(),如果想要发送消息后程序继续执行下一条语句则使用PostMessage()。
PostThreadMessage函数用来向线程发送消息,对于线程消息,MSG结构体中hwnd成员应为NULL。收消息的线程也必须有message queue(消息队列)。
参考:http://baike.baidu.com/link?url=BDv2_a-uBVOVe1jzJ1kZ7Q4SYoI5qP1Eq4JBqA60luNQT5a1urd1H2GihkvMU2PWLLzZ8UnRub3XsCriNaWuEq
http://baike.baidu.com/link?url=COaT6VDTfb0OmuACYswtZtYL8UoAa1z55fS4WZIfRBq9c4Enn3BeXv2IS9zoQEvLqD_fQMeT8_Sxxqyj6WGW0a