SendMessage与PostMessage

来源:互联网 发布:apache 用户认证 编辑:程序博客网 时间:2024/06/08 09:06

  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函数将一个消息放入(寄送)到与指定窗口创建的线程相关联的消息队列里,不等待线程处理消息就立刻返回函数执行成功返回非0,否则返回0。函数参数意义与SendMessage相同。

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。

参考:http://baike.baidu.com/link?url=BDv2_a-uBVOVe1jzJ1kZ7Q4SYoI5qP1Eq4JBqA60luNQT5a1urd1H2GihkvMU2PWLLzZ8UnRub3XsCriNaWuEq

            http://baike.baidu.com/link?url=COaT6VDTfb0OmuACYswtZtYL8UoAa1z55fS4WZIfRBq9c4Enn3BeXv2IS9zoQEvLqD_fQMeT8_Sxxqyj6WGW0a

0 0