在WINDOW编程中,发送消息的常用API有SendMessage,PostMessage,PostThreadMessage。

一般每个线程有两个队列:一个用来接收通过Send函数的消息,另外一个队列接收通过Post函数的消息。该两个函数的基本区别是:一个函数需要等待返回的,相当于函数调用,这个是SendMessage;另外一个是将消息放到对方的队列中,然后直接返回。

使用PostMessage可能防止发送的线程给挂起,但有的时候我们必须通过SendMessage来发送消息(例如:WM_COPYDATA消息)。由于这种原因,就有可能会导致你的发送线程被接收线程的某些操作给挂起,这是很正常的。例如你给对方发送了这个消息,但这个时候刚好对方线程或进程结束了,那么SendMessage不会返回,这个时候你的程序很可能就会挂掉。

使用 SendMessageTimeOut 可以帮助我们解决这个问题。我们可以设置一个等待时间,一般情况下,这个消息应该会在这个时间会返回,但异常情况就通过这个TIME来帮助我们返回,从而知道对象的线程挂起而避免自己被挂起。

【函数功能】:

该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。

【函数原型】:

  1. LRESULT SendMessageTimeout(HWND hwnd,
  2. UINT Msg,
  3. WPARAM wParam,
  4. LPARAM IParam,
  5. UINT fuFlags,
  6. UIUT uTimeout,
  7. LPDWORD lpdwResultult);

【参数说明】

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
fuFlags:指定如何发送消息。此参数可为下列值的组合:
SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。
SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。
SMTO_NORMAL:调用线程等待函数返回时,不被阻止处理其他请求。
SMTO_NOTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。
uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。
IpdwResult:指定消息处理的结果,依赖于所发送的消息。
返回值:如果函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。

https://blog.csdn.net/hellokandy/article/details/53408799

最新文章

  1. GNU make简要介绍①指定变量、自动推导规则、清除工作目录过程文件
  2. angular-ui-bootstrap的进度条问题及解决
  3. Delphi 使用之函数
  4. 红帽中出现”This system is not registered with RHN”的解决方案
  5. Magento中如何调用SQL语句
  6. UVALive - 6571 It Can Be Arranged 最大流
  7. 微信web调试工具
  8. .NET Json 解析到Dictionary,原生代码
  9. Java经典书籍
  10. Android 开发技术流程
  11. 百度Web前端面试经历
  12. TCP模型及其重点协议总结
  13. 关于Mac 系统mysql 乱码问题
  14. FormCollection collection 使用
  15. 用python一起来看流星雨
  16. buffers和cached的区别
  17. 牛客多校第十场-D- Rikka with Prefix Sum
  18. web----Tornado
  19. 存储过程收集统计信息ORA-20000报错解决记录
  20. Python打印矩形、直角三角形、等腰三角形、菱形

热门文章

  1. 重排序列 & 拓扑排序
  2. 删除online日志測试及ora-600 [4194]错误的处理
  3. 使用dotcloud免费ssh
  4. stackFromBottom-listview 内容从底部开始填充
  5. 当鼠标聚焦时输入框变色(focus事件实例)
  6. amazeui学习笔记--css(常用组件12)--面板Panel
  7. win8.1 “服务器运行失败”的解决方法
  8. 挖一挖不经常使用到而又非常有用的重载-Split
  9. 10.8 android输入系统_实战_使用GlobalKey一键启动程序
  10. AES 加密解密