SendMessage,PostMessage
首先講這兩個函數的區別。SendMessage是阻塞的。PostMessage不是的。SendMessage會等
發去的消息被處理了才返回。PostMessage則只負責把消息放到相應的消息隊列中就返回了,
它不必等待消息的處理。
在使用上有一個要注意的地方。
在MFC中每個從CWnd繼承來的類,都有兩個成員函數SendMessage,PostMessage。
在Windows SDK中也有兩個函數SendMessage,PostMessage。這是有區別的。
下面均以PostMessage爲例來說明。
Windows SDK中的PostMessage有四個參數
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
但是CWnd的成員函數PostMessage只有三個參數
BOOL PostMessage(
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0
);
Windows SDK中的PostMessage的第一個參數就是發送消息的目的窗口的句柄。
而CWnd的PostMessage則把消息發送到本窗口對象的消息隊列裏。
前面有位同學的關於消息的提問,說他發送的消息,收不到,就是沒有注意到這些區別。
它直接使用成員函數PostMessage就想把菜單消息發送到另一個窗口中,讓處理菜單命令的
那個窗口處理菜單消息,顯然消息是發送到了本窗口對象的消息隊列裏,而本窗口對象又不
處理該菜單命令。
正確的使用方法應該是:
(1)用目的窗口對象的成員函數PostMessage
(2)使用SDK中的PostMessage,並在第一個參數上寫上目的窗口的句柄
比如:PostMessage(pWnd->GetSafeHwnd(),......
需要注意的是,這時候最好寫成::PostMessage(pWnd->GetSafeHwnd(),......形式
以區別成員函數PostMessage。::的意思不用講了吧,如果不懂,看C++去吧
發去的消息被處理了才返回。PostMessage則只負責把消息放到相應的消息隊列中就返回了,
它不必等待消息的處理。
在使用上有一個要注意的地方。
在MFC中每個從CWnd繼承來的類,都有兩個成員函數SendMessage,PostMessage。
在Windows SDK中也有兩個函數SendMessage,PostMessage。這是有區別的。
下面均以PostMessage爲例來說明。
Windows SDK中的PostMessage有四個參數
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
但是CWnd的成員函數PostMessage只有三個參數
BOOL PostMessage(
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0
);
Windows SDK中的PostMessage的第一個參數就是發送消息的目的窗口的句柄。
而CWnd的PostMessage則把消息發送到本窗口對象的消息隊列裏。
前面有位同學的關於消息的提問,說他發送的消息,收不到,就是沒有注意到這些區別。
它直接使用成員函數PostMessage就想把菜單消息發送到另一個窗口中,讓處理菜單命令的
那個窗口處理菜單消息,顯然消息是發送到了本窗口對象的消息隊列裏,而本窗口對象又不
處理該菜單命令。
正確的使用方法應該是:
(1)用目的窗口對象的成員函數PostMessage
(2)使用SDK中的PostMessage,並在第一個參數上寫上目的窗口的句柄
比如:PostMessage(pWnd->GetSafeHwnd(),......
需要注意的是,這時候最好寫成::PostMessage(pWnd->GetSafeHwnd(),......形式
以區別成員函數PostMessage。::的意思不用講了吧,如果不懂,看C++去吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.