GetMessage&PeekMessage 和SendMessage&PostMessage

在Window 下Chromium 利用了MFC 消息循環機制,藉此,對MFC中消息獲取和投放的幾個函數進行總結下:

點擊打開鏈接

一、GetMessage&PeekMessage

GetMessage 函數結構如下:


    BOOL GetMessage(  
      LPMSG lpMsg,         // 一個MSG的指針  
      HWND hWnd,           // 一般爲當前窗口的句柄  
      UINT wMsgFilterMin,  // 要取的消息的最小值  
      UINT wMsgFilterMax   // 要取的消息的最大值  
    );  


如果第三,四個參數都爲零,則取所有的消息。
備註:當GetMessage函數取完一條消息後,就從消息隊列中把這條消息個刪掉。

一般用法:GetMessage(&msg,NULL,0,0);
這樣可以接受所有消息,在執行GetMessage函數後,如果消息隊列中沒有消息,則函數不返回,
一直等待,直到從消息隊列中獲取一條消息後返回。
當消息不是WM_QUIT消息時,返回一個非零值;接受WM_QUIT消息時,返回零。
所以一般如下取消息和分發消息:

    While(GetMessage(&msg,NULL,0,0))  
    {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);  
    }  



PeekMessage函數結構如下:

    BOOL PeekMessage(  
      LPMSG lpMsg,          
      HWND hWnd,            
      UINT wMsgFilterMin,   
      UINT wMsgFilterMax,   //前四個參數和GetMessage的一樣  
      UINT wRemoveMsg      // 取完消息要做的操作  
    );  


最後一個參數值可以是PM_NOREMOVE或者PM_REMOVE兩種方式,
PM_NOREMOVE 表示取完消息後,不刪除消息;
PM_REMOVE 表示取完消息後,刪除掉消息。


PeekMessage則不管消息隊列是否有消息,更像是Peek單詞一樣,瞥一下消息隊列是否有消息,
有消息則返回非零值,沒有消息則返回零值。


二、SendMessage&PostMessage
PostMessage 函數只是把消息放入消息隊列,不管其他程序是否處理都返回,然後繼續執行,是一個異步消息投放函數;
SendMessage 函數則必須等待其他程序處理消息完了之後才返回,繼續執行,與PostMessage函數相比,這是個同步消息投放函數


PostMessage 函數的返回值表示PostMessage函數執行是否正確;
SendMessage 函數的返回值表示其他程序處理消息後的返回值,如果其他程序沒有處理完,則一直阻塞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章