SendMessageTimeout
函数功能: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)所有,转载请注明来源。
页:
[1]