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

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

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

使用SendMessage()可以解決這個問題,只不過在時間效率上會有點下降。

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

LRESULT 返回消息被處理的結果,在消息被處理之后才會返回。BOOL 只是返回傳送的結果,是不是已經送到消息隊列。

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

2         同一個線程內:
            SendMessage 發(fā)送消息時,由USER32.DLL模塊調用目標窗口的消息處理程序,并將結果返回,SendMessage 在同一個線程里面發(fā)送消息不進入線程消息隊列;PostMessage 發(fā)送的消息要先放到消息隊列,然后通過消息循環(huán)分派到目標窗口(DispatchMessage)。

3         不同線程:
            SendMessage 發(fā)送消息到目標窗口的消息隊列,然后發(fā)送消息的線程在USER32。DLL模塊內監(jiān)視和等待消息的處理結果,直到目標窗口的才處理返回,SendMessage在返回之前還需要做許多工作,如響應別的線程向它發(fā)送的SendMessage().PostMessge() 到別的線程的時候最好使用PostThreadMessage  代替。PostMessage()的HWND 參數可以為NULL,相當于PostThreadMessage() + GetCrrentThreadId.

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

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

在控制別的應用程序的時候,經常需要等待直到某個功能結束,例如:
   打開一個窗口-->等待直到窗口結束 ,這個時候就可以用到SendMessage
   如果在打開這個窗口后仍然需要對該窗口的界面進行設置,比如Editvalue等等,比如:
      打開一個窗口-->控制窗口的control的屬性
   這個時候就需要PostMessage

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

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