WindowsAPI中PostMessage与SendMessage的区别
1、返回值意義的區別,先看一下 MSDN 里的聲明:
LRESULT SendMessage(
??????? HWND hWnd,
??????? UINT Msg,
??????? WPARAM wParam,
??????? LPARAM lParam
);
BOOL PostMessage(
??????? HWND hWnd,
??????? UINT Msg,
??????? WPARAM wParam,
??????? LPARAM lParam
);
其中?4 個參數的意義是一樣的,返回值類型不同。PostMessage的返回值(BOOL)表示PostMessage函數執行是否正確,SendMessage的返回值(LRESULT )表示其他程序處理消息后的返回值。
2、PostMessage 是異步的,SendMessage 是同步的。
PostMessage 只把消息放入隊列,不管消息是否被處理就返回,消息可能不被處理;而 SendMessage 等待消息被處理完了之后才返回,如果消息不被處理,發送消息的線程將一直被阻塞。
3、 當一個線程向該線程所建立的窗口SendMessage消息時,由 USER32.DLL 模塊調用目標窗口的消息處理程序,并將結果返回,它只是調用指定窗口的消息處理過程,并不將消息入隊列。當一個線程向另一個線程所建立的窗口 SendMessage時,該消息要追加到接收消息線程的發送消息隊列,然后發送消息的線程進入等待狀態,接收消息的線程處理完該消息后,由系統喚醒發送 消息的線程,這時發送線程繼續進行。PostMessage 發送消息時,消息要先放入線程的消息隊列,然后通過消息循環分派到目標窗口(DispatchMessage)。一個線程的消息隊列實際上分為四種不同的 消息隊列:Post消息隊列、Send消息隊列、輸入消息隊列、應答消息隊列。PostMessage是將消息追加到Post消息隊列,SendMessage是追加到Send消息隊列,兩個隊列處理的優先級并不一樣。
//*****
1.返回值
其中 函數4 個參數的意義是一樣的,返回值類型不同(其實從數據上看他們一樣是一個 32 位的數,只是意義不一樣),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 是同步的?! ?/p>
?PostMessage 只把消息放到隊列,不管消息是不是被處理就返回,消息可能不被處理;
? ? ? ? ? ? ???SendMessage等待消息被處理完了才返回,如果消息不被處理,發送消息的線程將一直處于阻塞狀態,等待消息的返回。
同一個線程內:
?SendMessage 發送消息時,由USER32.DLL模塊調用目標窗口的消息處理程序,并將結果返回,SendMessage 在同一個線程里面發送消息不進入線程消息隊列;PostMessage 發送的消息要先放到消息隊列,然后通過消息循環分派到目標窗口(DispatchMessage)。
? ? ? ? ? ? ? 不同線程內:
???????????? ?SendMessage 發送消息到目標窗口的消息隊列,然后發送消息的線程在USER32.DLL模塊內監視和等待消息的處理結果,直到目標窗口的才處理返回,SendMessage在返回之前還需要做許多工作,如響應別的線程向它發送的SendMessage().PostMessge() 到別的線程的時候最好使用PostThreadMessage?? 代替。PostMessage()的HWND 參數可以為NULL,相當于PostThreadMessage() + GetCrrentThreadId.
3.系統只整理和編號系統消息(0 到 WM_USER 之間的消息),發送用戶消息(WM_USER 以上)到別的進程時,需要自己定義。
用 PostMessage、SendNotifyMessage、SendMessageCallback 等異步函數發送系統消息時,參數里不可以使用指針,因為發送者并不等待消息的處理就返回,接受者還沒處理指針就已經被釋放了。
總結
以上是生活随笔為你收集整理的WindowsAPI中PostMessage与SendMessage的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决:您需要来自xxx的权限才能对此文件
- 下一篇: springboot 项目输出 sql