鱼C论坛

 找回密码
 立即注册
查看: 5613|回复: 0

[API档案] SendMessageTimeout

[复制链接]
发表于 2016-2-17 23:54:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数功能:

SendMessageTimeout 函数发送指定消息给一个或多个窗口。

SendMessageTimeout 函数具备超时限制的功能。


API 函数原型:
LRESULT WINAPI SendMessageTimeout(
  _In_      HWND       hWnd,
  _In_      UINT       Msg,
  _In_      WPARAM     wParam,
  _In_      LPARAM     lParam,
  _In_      UINT       fuFlags,
  _In_      UINT       uTimeout,
  _Out_opt_ PDWORD_PTR lpdwResult
);

参数解析:

参数 含义
hWnd 1. 指定接收消息的窗口句柄
2. 如果该参数的值是 HWND_BROADCAST((HWND)0xffff),那么消息将发送给所有的顶层窗口(包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息就是不发送给子窗口)。直到每一个窗口过程处理完消息或指定的超时周期结束,函数才会返回。因此,函数最长的等待时间应该是 uTimeout 参数和顶层窗口数量的乘积
Msg 1. 指定将被发送的消息
2. 请参考:Windows 常用消息及含义
wParam消息的附加信息
lParam消息的附加信息
fuFlags 指定该函数的行为,该参数可以是以下一个或多个值的组合:
含义
SMTO_ABORTIFHUNG 如果接收消息的线程出现不响应或挂起状态时,直接返回而不等待超时周期结束
SMTO_BLOCK 在函数返回之前,阻止调用线程处理其他请求(比如非队列消息)
SMTO_NORMAL 在调用线程等待函数返回时,不被阻止它处理其他的请求
SMTO_NOTIMEOUTIFNOTHUNG只要接收消息的线程在处理消息(没有被挂起),函数的返回不受超时周期的约束
SMTO_ERRORONEXIT在消息被处理的过程中,如果接收消息的窗口被销毁或所属的线程已经结束,该函数返回 0
uTimeout1. 指定超时周期,单位是毫秒
2. 对于广播消息,每个窗口可以使用全部超时周期(即每个超时周期和窗口个数的乘积)
3. 例如你指定超时周期是 5 秒钟,然后有 3 个顶层窗口未能处理消息,那么最多就有 15 秒的延迟
lpdwResult 消息的处理结果


返回值:

1. 如果函数调用成功,返回值是非 0(如果使用 HWND_BROADCAST,SendMessageTimeout 函数不提供单个窗口的超时周期信息);

2. 如果函数调用失败或超时,返回值是 0(调用 GetLastError 函数的返回值是 ERROR_TIMEOUT,则说明是函数超时)。


备注:

1. 函数调用指定窗口的窗口过程,如果指定的窗口属于不同线程,函数在窗口过程处理完消息或等待超时周期结束时返回;如果接收消息的窗口和当前线程属于同一队列,那么直接调用窗口过程并忽略超时限制。

2. 如果接收消息的线程在 5 秒内没有调用 GetMessage 函数或其他类似函数,则该函数认为其没响应。

3. 系统只对系统级的消息(0 ~ WM_USER-1)进行封送处理。发送自定义消息(>= WM_USER)到另一个进程,你需要自己对消息进行封送处理。

【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表