?PostMessage
?
函數功能描述:將一個消息放到與指定窗口創建的線程相關的消息隊列中,不等線程處理消息就返回。消息隊列里的消息通過調用GetMessage或PeekMessage函數而獲得。
?
.函數原型:
??? BOOL PostMessage(
????? HWND hWnd,????? // 目標窗口句柄
????? UINT Msg,?????? // 被張貼的消息
????? WPARAM wParam,? // 第一個消息參數
????? LPARAM lParam?? // 第二個消息參數
??? );
??? BOOL PostMessage(
????? HWND hWnd,????? // 目標窗口句柄
????? UINT Msg,?????? // 被張貼的消息
????? WPARAM wParam,? // 第一個消息參數
????? LPARAM lParam?? // 第二個消息參數
??? );
?
.參數:
??? hWnd
??????? 窗口過程接收消息的窗口句柄。可取有特定含義的兩個值:
??????? 取值????????????????? 含義
??????? HWND_BROADCAST??????? 消息被送到系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。
????????????????????????????? 消息不被送到子窗口。
??????? NULL????????????????? 函數的行為和將參數dwThreadId設置為當前線程的標識符的PostThreadMessage函數一樣。
??? hWnd
??????? 窗口過程接收消息的窗口句柄。可取有特定含義的兩個值:
??????? 取值????????????????? 含義
??????? HWND_BROADCAST??????? 消息被送到系統的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。
????????????????????????????? 消息不被送到子窗口。
??????? NULL????????????????? 函數的行為和將參數dwThreadId設置為當前線程的標識符的PostThreadMessage函數一樣。
?
??? Msg
??????? 指定被發送的消息;
??? wParam
??????? 指定附加消息的特定信息;
??? lParam
??????? 指定附加消息的特定信息。
??????? 指定被發送的消息;
??? wParam
??????? 指定附加消息的特定信息;
??? lParam
??????? 指定附加消息的特定信息。
?
.返回值:
??? 如果調用函數成功,返回非零值。
??? 如果調用函數失敗,返回值是零。獲得更多的錯誤信息,請調用GetLastError函數。
?
.備注:
??? 需要以 HWND_BROADCAST 方式通信的應用程序應該使用 RegisterWindowMessage 函數來獲得應用程序間通信的獨特消息。
??? 如果發送一個低于WM_USER范圍的消息給異步消息函數(PostMessage.SendNotifyMessage或SendMesssgeCallback),消息參數不能包含指針,否則,操作將失敗。函數將在接收線程處理消息之前返回,發送者將在內存被使用之前釋放它。
?
?PostMessage和SendMessage有什么區別?
?
?在控制別的應用程序的時候,經常需要等待直到某個功能結束,例如:
?打開一個窗口-->等待直到窗口結束
?這個時候就可以用到SendMessage
?如果在打開這個窗口后仍然需要對該窗口的界面進行設置,比如Edit的value等等,比如:
?打開一個窗口-->控制窗口的control的屬性
?這個時候就需要PostMessage
?打開一個窗口-->等待直到窗口結束
?這個時候就可以用到SendMessage
?如果在打開這個窗口后仍然需要對該窗口的界面進行設置,比如Edit的value等等,比如:
?打開一個窗口-->控制窗口的control的屬性
?這個時候就需要PostMessage
?
?使用一個鉤子程序截獲消息后,使用SendMessage把消息發送到主處理程序進行處理,但是在主處理程序還沒有完成任務的時候,被設置鉤子的程序進入了停止的狀態,不可以處理
?WM_PAINT,
?WM_MOVE,
?.......等的基本信息,
?必須要等SendMessage發送出的消息完成后,才能繼續運行,整個界面一片空白,把鉤子消息設置成PostMessage的發送消息形式后,問題解決!
?我查了MSDN對這兩個API的定義,
?PostMessage只是把消息放入隊列,不管其他程序是否處理都返回,然后繼續執行;
?而SendMessage必須等待其他程序處理消息后才返回,繼續執行。
?PostMessage的返回值表示PostMessage函數執行是否正確;
?而SendMessage的返回值表示其他程序處理消息后的返回值。
?使用這兩個發送消息函數的最重要的是要看你的程序
?WM_PAINT,
?WM_MOVE,
?.......等的基本信息,
?必須要等SendMessage發送出的消息完成后,才能繼續運行,整個界面一片空白,把鉤子消息設置成PostMessage的發送消息形式后,問題解決!
?我查了MSDN對這兩個API的定義,
?PostMessage只是把消息放入隊列,不管其他程序是否處理都返回,然后繼續執行;
?而SendMessage必須等待其他程序處理消息后才返回,繼續執行。
?PostMessage的返回值表示PostMessage函數執行是否正確;
?而SendMessage的返回值表示其他程序處理消息后的返回值。
?使用這兩個發送消息函數的最重要的是要看你的程序