鱼C论坛

 找回密码
 立即注册
查看: 5164|回复: 2

[API档案] PostMessage

[复制链接]
发表于 2016-2-20 12:13:13 | 显示全部楼层 |阅读模式

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

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

x
函数功能:

PostMessage 函数将一个消息放入(posts)与指定窗口相关联的线程的消息队列中,并且不等待线程处理消息就立即返回。

如果要将消息放入与线程相关联的消息队列,请使用 PostThreadMessage 函数。


API 函数原型:
BOOL WINAPI PostMessage(
  _In_opt_ HWND   hWnd,
  _In_     UINT   Msg,
  _In_     WPARAM wParam,
  _In_     LPARAM lParam
);

参数解析:

参数 含义
hWnd1. 指定接收消息的窗口过程的窗口句柄
2. 如果该参数的值是 HWND_BROADCAST((HWND)0xffff),那么消息将发送给所有的顶层窗口(包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息就是不发送给子窗口)
3. 如果该参数的值是 NULL,函数的行为类似调用 PostThreadMessage 函数,并将 dwThreadId 参数设置为当前线程的标识符
4. 自 Windows Vista 系统开始,消息发送需服从 UIPI(User Interface Privilege Isolation,用户界面特权隔离)技术,消息只能发送到较小或同等级别的进程中的线程的消息队列
Msg 1. 指定将被发送的消息
2. 请参考:Windows 常用消息及含义
wParam 消息的附加信息
lParam 消息的附加信息


返回值:

1. 如果函数调用成功,返回值是非 0;

2. 如果函数调用失败,返回值是 0(调用 GetLastError 函数的返回值是 ERROR_NOT_ENOUGH_QUOTA,则说明投递消息超出限制)。


备注:

1. 当消息被 UIPI 所阻断,调用 GetLastError 函数可以获得错误代码是 5(拒绝访问)。

2. 从消息队列中获取消息,请使用 GetMessagePeekMessage 函数。

3. 对于需要使用 HWND_BROADCAST 通信的应用程序,应当调用 RegisterWindowMessage 函数来为应用程序间的通信取得一个唯一的消息。

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

5. 如果发送一个范围低于 WM_USER 的消息给异步消息函数(PostMessage、  SendNotifyMessageSendMessageCallback),它的消息参数不能包含指针。否则,操作将失败。函数将在接收线程处理消息之前返回,发送者将在内存被使用之前释放。

6. 请不要使用 PostMessage 函数投递 WM_QUIT 消息;应该使用 PostQuitMessage 函数代替。

7. 每个消息队列限制可以放入 10,000 个消息。这个限制应该是足够大的,如果你的应用程序超过限制,那么它应该重新设计以避免消耗太多的系统资源。不过修改下边注册表项,可以调整这个限制:

| HKEY_LOCAL_MACHINE
| -- SOFTWARE
| -- -- Microsoft
| -- -- -- Windows NT
| -- -- -- -- CurrentVersion
| -- -- -- -- -- Windows
| -- -- -- -- -- -- USERPostMessageLimit

注:可调节的最小值是 4000。


举例:

下边例子展示如何使用 PostMessage 函数投递窗口自定义消息。

假设自定义的消息叫做 WM_COMPLETE:
#define        WM_COMPLETE     (WM_USER + 0)
你可以将消息投递到与指定窗口相关联的线程的消息队列中,代码如下:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
 lTime = GetCurrentTime () ;
 PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);

【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-28 08:43:32 | 显示全部楼层
请问为什么 WM_SETTEXT WM_COPYDATA 不能用PostMessage ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 15:26:20 | 显示全部楼层
大赞!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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