1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。

2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。

3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.

如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。

PostThreadMessage

  函数功能:该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
  函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM IParam);
  参数
  idThread:其消息将被寄送的线程的线程标识符。如果线程没有消息队列,此函数将失败。当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。
  Msg:指定将被寄送的消息的类型。
  wParam:指定附加的消息特定信息。
  IParam:指定附加的消息特定信息。
  返回值:如果函数调用成功,返回非零值。如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果idThread不是一个有效的线程标识符或由idThread确定的线程没有消息队
  列,GetLastError返回ERROR_INVALID_THREAD。
  备注:消息将寄送到的线程必须创建消息队列,否则调用PostThreadMessage会失败。用下列方法之一来处理这种情况:
  调用PostThreadMessage。如果失败,调用Sleep,再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。
  创建一个事件对象,再创建线程。在调用PostThreadMessage之前,用函数WaitForSingleObject来等特事件被设置为被告知状态。消息将寄送到的线程调用PeekMessage(£msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)来强制系统创建消息队列。设置事件,表示线程已准备好接收寄送的消息。
  消息将寄送到的线程通过调用GetMesssge或PeekMesssge来取得消息。返回的MSG结构中的hwnd成员为NULL。

PeekMessage

  函数功能:该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。
  函数原型:BOOL PeekMessage(LPMSG IpMsg,HWND hWnd,UINT wMSGfilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);
  参数:
  lpMsg:接收消息信息的MSG结构指针。
  hWnd:其消息被检查的窗口的句柄。
  wMsgFilterMin:指定被检查的消息范围里的第一个消息。
  wMsgFilterMax:指定被检查的消息范围里的最后一个消息。
  wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:
  PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。
  PM_REMOVE:PeekMessage处理后,消息从队列里除掉。
  可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。
  缺省地,处理所有类型的消息。若只处理某些消息,指定一个或多个下列值:
  PM_QS_INPUT:Windows NT5.0和Windows 98:处理鼠标和键盘消息。
  PM_QS_PAINT:Windows NT 5.0和Windows 98:处理画图消息。
  PM_QS_POSTMESSAGE:Windows NT 5.0和Windows 98:处理所有被寄送的消息,包括计时器和热键。
  PM_QS_SENDMESSAGE:Windows NT 5.0和Windows 98:处理所有发送消息。
  返回值:如果消息可得到,返回非零值;如果没有消息可得到,返回值是零。
  备注:和函数GetMessage不一样的是,函数PeekMesssge在返回前不等待消息被放到队列里。
  PeekMesssge只得到那些与参数hWnd标识的窗口相联系的消息或被lsChild确定为其子窗口相联系的消息,并且该消息要在由参数wMsgFiterMin和wMsgFiherMax确定的范围内。如果hWnd为NULL,则PeekMessage接收属于当前调用线程的窗口的消息(PeekMessage不接收属于其他线程的窗口的消息)。如果hWnd为C1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。
  常数WM_KEYFIRST和WMKEYLAST可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRST和WM_MOUSELAST可用来接收所有的鼠标消息。
  PeekMessage通常不从队列里清除WM_PAINT消息。该消息将保留在队列里直到处理完毕。但如果WM_PAINT消息有一个空更新区,PeekMessage将从队列里清除WM_PAINT消息。
  Windows CE:有一个NULL更新区的WM_PAINT消息不从队列里清除。

最新文章

  1. Effective C++ 34 区分接口继承和实现继承
  2. 微信小程序-位置坐标
  3. mac(linux) 上如何安装ant
  4. jQuery加载一个html页面到指定的div里
  5. CUBRID学习笔记 7 ms常见错误
  6. C语言开发工具
  7. Android触摸事件的应用
  8. hdu--2084--dp--数塔
  9. HDU - 4496 City 逆向并查集
  10. (floyd)佛洛伊德算法
  11. javascript的变量声明、数据类型
  12. ionic安装教程
  13. 支持向量机SVM——专治线性不可分
  14. Angular 双向数据绑定
  15. Python mysql-表的创建,删除和更新
  16. 关于Unity中的碰撞检测和管理(2D)
  17. 【黑金ZYNQ7000系列原创视频教程】04.熟悉ZYNQ内部中断——内部定时器中断实验
  18. 2.8 The Object Model -- Enumerables
  19. uWSGI+Nginx+Flask在Linux下的部署
  20. mdev自动创建和删除设备节点

热门文章

  1. 免费的freedns实现动态域名和url转发
  2. gearmand 编译 could not find gperf
  3. .net网站的下载地址
  4. Python实现屏蔽敏感词
  5. java程序换图标
  6. Excel自动从身份证中提取生日、性别、年龄
  7. detection in video and image
  8. 用gulp把less文件编译成css文件
  9. Nodejs:Node.js模块机制小结
  10. linux下/dev/null被误删