在做基于窗口的Windows程序的时候,我们避免不了要向窗口发送消息,有两种方式,一种是PostMessage,另外一种是SendMessage。关于这两个宏,我是通过狠狠的看MSDN才搞明白的,那里讲的是最权威的。它们的区别如下:

1、PostMessage会将消息压入窗口所在线程的消息队列,然后返回;而SendMessage则不经过消息队列,SendMessage可认为是直接调用了该窗口的窗口过程,因此在我们需要获得消息处理后的返回值的时候,就要用到SendMessage。

例如:当在程序中指定如下使用:PostMessage(hWnd, WM_MSG,0,0),那么当程序执行到PostMessage的时候,仅将消息WM_MSG压入到创建hWnd所指窗口的那个线程的消息队列,然后程序将继续执行下去,而至于程序什么时候响应该消息,则要看那个线程什么时候得到控制权;

而指定如下使用:SendMessage(hWnd, WM_MSG,0,0),那么当程序执行到该处时,将发生一次跳转:从当前位置,跳转到hWnd的窗口过程中去响应WM_MSG消息,当消息处理结束,窗口过程返回,程序又将从SendMessage后面继续执行,当然,我们可以获得窗口过程对该消息的处理结果,也即取SendMessage的返回值。(这里只是针对单线程)。

 
2、在多线程应用中,PostMessage的用法还是一样,但SendMessage则不同了。如果在线程A中向线程B所创建的一个窗口hWndB发送消息SendMessage(hWndB,WM_MSG,0,0),那么系统将会立即将执行权从线程A切换到线程B,然后在线程B中调用hWndB的窗口过程来处理消息,并且在处理完该消息后,执行权仍然在B手中!这个时候,线程A则暂停在SendMessage处,等待下次线程A获得执行权后才继续执行,并且仍然可以获得消息处理的结果(返回值)。一般,为了避免死锁,在B中对WM_MSG做出处理之前,要加上:
      if(InSendMessage())

       RelpyMessage(lResult);

即判断:如果该消息是发自另外一个线程,则立即 RelpyMessage,回复消息,参数lResult即是返回值。而如果是在同一个线程内,则InSendMessage()将会返回FALSE。

最新文章

  1. linux下可执行程序的装载和启动
  2. css3之背景新属性
  3. SSH(Struts Spring Hibernate开发框架)
  4. python访问数据库一
  5. 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)
  6. 软件工程第一次个人项目——词频统计by11061153柴泽华
  7. Apache URL转发
  8. asp.net mvc视图中使用entitySet类型数据时提示出错
  9. ●SPOJ 8222 NSUBSTR–Substrings
  10. hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)
  11. 制作自己cocoapods库
  12. WebGL教程
  13. MySQL之ORDER BY 详细解析
  14. 嵌入式Linux内时区配置
  15. 10、Android--技巧
  16. Phonegap 事件机制
  17. Java面试题之数据库三范式是什么?
  18. UVALive - 7042 The Problem to Make You Happy 博弈
  19. mysql-shell的安装和使用
  20. gpg: symbol lookup error

热门文章

  1. 转:Java学习路线图,专为新手定制的Java学习计划建议
  2. svn merge 回滚
  3. SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
  4. Form_通过Trace分析Concurrent和Form性能和异常详解(案例)
  5. CF478 B. Random Teams 组合数学 简单题
  6. 数据库事务 及ACID
  7. Oracle 查看表空间的大小
  8. ASP.NET优化
  9. 服务器压力测试 ab
  10. Oracle中的多表查询