分類:
var hwnd: hwnd;//句柄
PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0); //最小化
PostMessage(hwnd,WM_SYSCOMMAND, SC_MAXIMIZE,0);//最大化
PostMessage(hwnd,WM_SYSCOMMAND, SC_CLOSE,0);//關閉
窗口最小化時將釋放占用的資源
PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0)比showwindow(hwnd,SW_MINIMIZE)好用
在控制別的應用程序的時候,經常需要等待直到某個功能結束,例如:
打開一個窗口-->等待直到窗口結束
這個時候就可以用到SendMessage
如果在打開這個窗口后仍然需要對該窗口的界面進行設置,比如Edit的value等等,比如:
打開一個窗口-->控制窗口的control的屬性
這個時候就需要PostMessage
使用一個鈎子程序截獲消息后,使用SendMessage把消息發送到主處理程序進行處理,但是在主處理程序還沒有完成任務的時候,被設置鈎子的程序進入了停止的狀態,不可以處理
WM_PAINT,
WM_MOVE,
.......等的基本信息,
必須要等SendMessage發送出的消息完成后,才能繼續運行,整個界面一片空白,把鈎子消息設置成PostMessage的發送消息形式后,問題解決!
我查了MSDN對這兩個API的定義,
PostMessage只是把消息放入隊列,不管其他程序是否處理都返回,然后繼續執行;
而SendMessage必須等待其他程序處理消息后才返回,繼續執行。
PostMessage的返回值表示PostMessage函數執行是否正確;
而SendMessage的返回值表示其他程序處理消息后的返回值。
使用這兩個發送消息函數的最重要的是要看你的程序是否要對消息的滯后性關注否,PostMessage會造成消息的滯后性,而SendMessage則不會,但如果SendMessage消息處理失敗,則會造成程序停止!
1, PostMessage只把消息放入隊列,不管其他程序是否處理都返回,然后繼續執行,這是個異步消息投放函數。而SendMessage必須等待其他程 序處理消息完了之后才返回,繼續執行,這是個同步消息投放函數。而且,PostMessage的返回值表示PostMessage函數執行是否正確;而 SendMessage的返回值表示其他程序處理消息后的返回值。這點大家應該都明白。
2, 如果在同一個線程內,PostMessage發送消息時,消息要先放入線程的消息隊列,然后通過消息循環Dispatch到目標窗口。 SendMessage發送消息時,系統直接調用目標窗口的消息處理程序,並將結果返回。SendMessage在同一線程中發送消息並不入線程消息隊 列。 如果在不同線程內。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage發送消息到目標窗口所屬 的線程的消息隊列,然后發送消息的線程等待(事實上,他應該還在做一些監測工作,比如監視QS_SENDMESSAGE標志),直到目標窗口處理完並且結 果返回,發送消息的線程才繼續運行。這是SendMessage的一般情況,事實上,處理過程要復雜的多。比如,當發送消息的線程監測到有別的窗口 SendMessage一個消息到來時,他直接調用窗口處理過程(重入),並將處理結果返回(這個過程不需要消息循環中GetMessage等的支持)。
3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.
如果發送的消息碼在WM_USER之下(非自定義消息)且消息參數中帶有指針,那么 PostMessage,SendNotifyMessage,SendMessageCallback這些異步消息發送函數將會調用失敗。 最好不要用PostMessage發送帶有指針參數的消息。