日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

WindowsAPI中PostMessage与SendMessage的区别

發(fā)布時(shí)間:2023/12/18 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WindowsAPI中PostMessage与SendMessage的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。