WindowsAPI中PostMessage与SendMessage的区别
1、返回值意義的區(qū)別,先看一下 MSDN 里的聲明:
LRESULT SendMessage(
??????? HWND hWnd,
??????? UINT Msg,
??????? WPARAM wParam,
??????? LPARAM lParam
);
BOOL PostMessage(
??????? HWND hWnd,
??????? UINT Msg,
??????? WPARAM wParam,
??????? LPARAM lParam
);
其中?4 個(gè)參數(shù)的意義是一樣的,返回值類(lèi)型不同。PostMessage的返回值(BOOL)表示PostMessage函數(shù)執(zhí)行是否正確,SendMessage的返回值(LRESULT )表示其他程序處理消息后的返回值。
2、PostMessage 是異步的,SendMessage 是同步的。
PostMessage 只把消息放入隊(duì)列,不管消息是否被處理就返回,消息可能不被處理;而 SendMessage 等待消息被處理完了之后才返回,如果消息不被處理,發(fā)送消息的線程將一直被阻塞。
3、 當(dāng)一個(gè)線程向該線程所建立的窗口SendMessage消息時(shí),由 USER32.DLL 模塊調(diào)用目標(biāo)窗口的消息處理程序,并將結(jié)果返回,它只是調(diào)用指定窗口的消息處理過(guò)程,并不將消息入隊(duì)列。當(dāng)一個(gè)線程向另一個(gè)線程所建立的窗口 SendMessage時(shí),該消息要追加到接收消息線程的發(fā)送消息隊(duì)列,然后發(fā)送消息的線程進(jìn)入等待狀態(tài),接收消息的線程處理完該消息后,由系統(tǒng)喚醒發(fā)送 消息的線程,這時(shí)發(fā)送線程繼續(xù)進(jìn)行。PostMessage 發(fā)送消息時(shí),消息要先放入線程的消息隊(duì)列,然后通過(guò)消息循環(huán)分派到目標(biāo)窗口(DispatchMessage)。一個(gè)線程的消息隊(duì)列實(shí)際上分為四種不同的 消息隊(duì)列:Post消息隊(duì)列、Send消息隊(duì)列、輸入消息隊(duì)列、應(yīng)答消息隊(duì)列。PostMessage是將消息追加到Post消息隊(duì)列,SendMessage是追加到Send消息隊(duì)列,兩個(gè)隊(duì)列處理的優(yōu)先級(jí)并不一樣。
//*****
1.返回值
其中 函數(shù)4 個(gè)參數(shù)的意義是一樣的,返回值類(lèi)型不同(其實(shí)從數(shù)據(jù)上看他們一樣是一個(gè) 32 位的數(shù),只是意義不一樣),LRESULT 表示的是消息被處理后的返回值,BOOL 表示的是消息是不是 Post 成功。
| 1 2 3 4 | LRESULT?SendMessage (??HWND?hWnd, ????????UINT?Msg, ????????WPARAM?wParam, ????????LPARAM?lParam ); |
| 1 2 3 4 | BOOL?PostMessage(??HWND?hWnd, ????????UINT?Msg, ????????WPARAM?wParam, ????????LPARAM?lParam); |
2、PostMessage 是異步的,SendMessage 是同步的。
?PostMessage 只把消息放到隊(duì)列,不管消息是不是被處理就返回,消息可能不被處理;
? ? ? ? ? ? ???SendMessage等待消息被處理完了才返回,如果消息不被處理,發(fā)送消息的線程將一直處于阻塞狀態(tài),等待消息的返回。
同一個(gè)線程內(nèi):
?SendMessage 發(fā)送消息時(shí),由USER32.DLL模塊調(diào)用目標(biāo)窗口的消息處理程序,并將結(jié)果返回,SendMessage 在同一個(gè)線程里面發(fā)送消息不進(jìn)入線程消息隊(duì)列;PostMessage 發(fā)送的消息要先放到消息隊(duì)列,然后通過(guò)消息循環(huán)分派到目標(biāo)窗口(DispatchMessage)。
? ? ? ? ? ? ? 不同線程內(nèi):
???????????? ?SendMessage 發(fā)送消息到目標(biāo)窗口的消息隊(duì)列,然后發(fā)送消息的線程在USER32.DLL模塊內(nèi)監(jiān)視和等待消息的處理結(jié)果,直到目標(biāo)窗口的才處理返回,SendMessage在返回之前還需要做許多工作,如響應(yīng)別的線程向它發(fā)送的SendMessage().PostMessge() 到別的線程的時(shí)候最好使用PostThreadMessage?? 代替。PostMessage()的HWND 參數(shù)可以為NULL,相當(dāng)于PostThreadMessage() + GetCrrentThreadId.
3.系統(tǒng)只整理和編號(hào)系統(tǒng)消息(0 到 WM_USER 之間的消息),發(fā)送用戶(hù)消息(WM_USER 以上)到別的進(jìn)程時(shí),需要自己定義。
用 PostMessage、SendNotifyMessage、SendMessageCallback 等異步函數(shù)發(fā)送系統(tǒng)消息時(shí),參數(shù)里不可以使用指針,因?yàn)榘l(fā)送者并不等待消息的處理就返回,接受者還沒(méi)處理指針就已經(jīng)被釋放了。
總結(jié)
以上是生活随笔為你收集整理的WindowsAPI中PostMessage与SendMessage的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决:您需要来自xxx的权限才能对此文件
- 下一篇: java信息管理系统总结_java实现科