PostMessage将消息放入消息队列中,不等待消息处理,当即返回,消息队列里的消息经过调用GetMessage和PeekMessage取得。异步
函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
参数
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的全部顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
NULL:此函数的操做和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数同样。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:若是函数调用成功,返回非零值:若是函数调用失败,返回值是零。若想得到更多的错误信息,请调用GetLastError函数。
备注:须要以 HWND_BROADCAST方式通讯的应用程序应当用函数 RegisterwindwosMessage来得到应用程序间通讯的独特的消息。
若是发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。不然,操做将会失败。函数将再接收线程处理消息以前返回,发送者将在内存被使用以前释放。函数
PostMessage消息中传值尽可能避免传指针,由于消息投递到目标线程消息队列后,程序继续执行,而此时消息并无立刻处理,等到线程处理此消息时,指针内容可能已经释放,或者发生改变。spa
SendMessage发送消息,等到消息被处理后返回,即消息处理函数返回后,SendMessage才会继续执行下去;线程
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。若是此参数为HWND_BROADCAST,则消息将被发送到系统中全部顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息,即消息处理函数返回值。
备注:须要用HWND_BROADCAST通讯的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通讯取得一个惟一的消息。
若是指定的窗口是由调用线程建立的,则窗口程序当即做为子程序调用。若是指定的窗口是由不一样线程建立的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。指针
SendMessageTimeout等待一段时间以后,消息处理函数没有返回,则放弃等待,继续执行;队列
PostThreadMessage:将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。内存
BOOL PostThreadMessage (DWORD idThread, UINT Msg, WPARAM wParam, LPARAM IParam);
原型
idThread:
其消息将被寄送的线程的线程标识符。若是线程没有消息队列,此函数将失败。
当线程第一次调用一个Win 32 USER或GDI函数时,系统建立线程的消息队列。要获得更多的信息,参见备注。消息队列
Msg:指定将被寄送的消息的类型。ast
wParam:指定附加的消息特定信息。
若是在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,而后经过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 若是在不一样线程内,最好用PostThreadMessage代替PostMessage,他工做的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,而后发送消息的线程等待(事实上,他应该还在作一些监测工做,好比监视QS_SENDMESSAGE标志),直到目标窗口处理完而且结果返回,发送消息的线程才继续运行。这是SendMessage的通常状况,事实上,处理过程要复杂的多。好比,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不须要消息循环中GetMessage等的支持)。