在調(diào)試程序的時(shí)候發(fā)現(xiàn),用PostMessage 傳出去的值在我使用的時(shí)候已經(jīng)發(fā)生了變化,百思不得其解。

用循環(huán)去找一個(gè)文件,找到的文件名稱(chēng)暫存在一個(gè)臨時(shí)變量里面,找到之后把這個(gè)名稱(chēng)傳到另外的函數(shù)處理,調(diào)試發(fā)現(xiàn),處理的總是在我需要的文件后面找到的文件,原因是在我使用的時(shí)候那個(gè)暫存變量里面的值已經(jīng)發(fā)生了變化(循環(huán)已經(jīng)處理到了下一步了),

PostMessage 和SendMessage的區(qū)別主要在于是否等待其他程序消息處理。PostMessage只是把消息放入隊(duì)列,不管其他程序是否處理都返回,然后繼續(xù)執(zhí)行;而SendMessage必須等待其他程序處理消息后才返回,繼續(xù)執(zhí)行。這兩個(gè)函數(shù)的返回值也不同,PostMessage的返回值表示PostMessage函數(shù)執(zhí)行是否正確,而SendMessage的返回值表示其他程序處理消息后的返回值。

使用SendMessage()可以解決這個(gè)問(wèn)題,只不過(guò)在時(shí)間效率上會(huì)有點(diǎn)下降。

函數(shù)原型:
   LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
   BOOL       PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

LRESULT 返回消息被處理的結(jié)果,在消息被處理之后才會(huì)返回。BOOL 只是返回傳送的結(jié)果,是不是已經(jīng)送到消息隊(duì)列。

從網(wǎng)絡(luò)上找到一些資料:
   
1      PostMessage 是異步的,SendMessage 是同步的。
         PostMessage 只把消息放到隊(duì)列,不管消息是不是被處理就返回,消息可能不被處理;
         SendMessage等待消息被處理完了才返回,如果消息不被處理,發(fā)送消息的線程將一直處于阻塞狀態(tài),等待消息的返回。

2         同一個(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)。

3         不同線程:
            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.

4         系統(tǒng)處理消息。
            系統(tǒng)只處理(marshal)系統(tǒng)消息(0--WM_USER),發(fā)送用戶消息(用戶自己定義)時(shí)需要用戶自己處理。
            使用PostMessage,SendNotifyMessage,SendMessageCallback等異步函數(shù)發(fā)送系統(tǒng)消息時(shí),參數(shù)不可以使用指針,因?yàn)榘l(fā)送者不等待消息的處理就返回,接收者還沒(méi)有處理,指針就有可能被釋放了,或則內(nèi)容變化了。

5 在Windows 2000/XP,每個(gè)消息隊(duì)列最多只能存放一定數(shù)量的消息,超過(guò)的將不會(huì)被處理就丟掉。系統(tǒng)默認(rèn)是10000;:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit
可以修改(我的系統(tǒng)下沒(méi)有發(fā)現(xiàn))。

在控制別的應(yīng)用程序的時(shí)候,經(jīng)常需要等待直到某個(gè)功能結(jié)束,例如:
   打開(kāi)一個(gè)窗口-->等待直到窗口結(jié)束 ,這個(gè)時(shí)候就可以用到SendMessage
   如果在打開(kāi)這個(gè)窗口后仍然需要對(duì)該窗口的界面進(jìn)行設(shè)置,比如Editvalue等等,比如:
      打開(kāi)一個(gè)窗口-->控制窗口的control的屬性
   這個(gè)時(shí)候就需要PostMessage

使用一個(gè)鉤子程序截獲消息后,使用SendMessage把消息發(fā)送到主處理程序進(jìn)行處理,但是在主處理程序還沒(méi)有完成任務(wù)的時(shí)候,被設(shè)置鉤子的程序進(jìn)入了停止的狀態(tài),不可以處理 WM_PAINT, WM_MOVE, .......等的基本信息必須要等SendMessage發(fā)送出的消息完成后,才能繼續(xù)運(yùn)行,整個(gè)界面一片空白,把鉤子消息設(shè)置成PostMessage的發(fā)送消息形式后,問(wèn)題解決!

      PostMessage只是把消息放入隊(duì)列,不管其他程序是否處理都返回,然后繼續(xù)執(zhí)行;
   而SendMessage必須等待其他程序處理消息后才返回,繼續(xù)執(zhí)行。
      PostMessage
的返回值表示PostMessage函數(shù)執(zhí)行是否正確;
   而SendMessage的返回值表示其他程序處理消息后的返回值。 
   使用這兩個(gè)發(fā)送消息函數(shù)的最重要的是要看你的程序是否要對(duì)消息的滯后性關(guān)注否,PostMessage會(huì)造成消息的滯后性,SendMessage則不會(huì),但如