在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 函數的返回值表示其他程序處理消息後的返回值,如果其他程序沒有處理完,則一直阻塞