PostMessage和PostThreadMessage的区别
PostThreadMessage
将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。既可以发送消息给工作线程,也可以发送给UI线程。其原型如下:
BOOL PostThreadMessage(
DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
idThread:
其消息将被寄送的线程的线程标识符。如果线程没有消息队列,此函数将失败。
当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。
其消息将被寄送的线程的线程标识符。如果线程没有消息队列,此函数将失败。
当线程第一次调用一个Win 32 USER或GDI函数时,系统创建线程的消息队列。要得到更多的信息,参见备注。
Msg:指定将被寄送的消息的类型。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。
返回值:
如果函数调用成功,返回非零值。
如果函数调用失败,返回值是零。
若想获得更多的错误信息,请调用GetLastError函数。
如果idThread不是一个有效的线程标识符或由idThread确定的线程没有消息队列,
GetLastError返回ERROR_INVALID_THREAD_ID。
GetLastError返回ERROR_INVALID_THREAD_ID。
备注:消息将寄送到的线程必须创建消息队列,否则调用PostThreadMessage会失败。
用下列方法之一来处理这种情况:
1) 调用PostThreadMessage。如果失败,调用Sleep,
再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。
再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。
2) 创建一个事件对象,再创建线程。在调用PostThreadMessage之前,
用函数WaitForSingleObject来等待事件被设置为被告知状态。
消息将寄送到的线程调用PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)
来强制系统创建消息队列。设置事件,表示线程已准备好接收寄送的消息。
用函数WaitForSingleObject来等待事件被设置为被告知状态。
消息将寄送到的线程调用PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)
来强制系统创建消息队列。设置事件,表示线程已准备好接收寄送的消息。
消息将寄送到的线程通过调用GetMesssge或PeekMesssge来取得消息。
返回的MSG结构中的hwnd成员为NULL。
返回的MSG结构中的hwnd成员为NULL。
PostMessage
将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。
消息队列里的消息通过调用GetMessage和PeekMessage取得。其原型如下:
消息队列里的消息通过调用GetMessage和PeekMessage取得。其原型如下:
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
hWnd:
其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、
被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:
如果函数调用成功,返回非零值:
如果函数调用失败,返回值是零。
若想获得更多的错误信息,请调用GetLastError函数。
如果函数调用失败,返回值是零。
若想获得更多的错误信息,请调用GetLastError函数。
分类:
WINDOWS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本