PreTranslateMessage 与 WindowProc 的关系

来源:互联网 发布:网络用语大全 真的很全 编辑:程序博客网 时间:2024/04/27 21:36

 摘至http://topic.csdn.net/u/20070828/17/a4283e65-6176-4673-8559-5e822667b4d3.html

 

MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理(进入WindowProc);
如果用SendMessage,   则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。

 

好像不对,我没看MFC中的 SendMessage,GetMessage ,文档,但看了 SDK的 GetMessage文档:
他的描述是: 

During this call,the system delivers pending messages that were send to windows owned by 
the calling thread using the SendMessage,SendMessageCallback,SendMessageTimeout or 
SendNotifyMessage function. The system may also process internal events. Message are
processed in the folloing order:
Sent messages
Posted messages
Input(hardware) messages and system internal events
Sent messages(again)
WM_PAINT messags
WM_TIMER messags.

似乎 GetMessage 也会取得 SendMessage产生的消息

 

SendMessage要区分环境,如果是对本线程的窗口SendMessage,则不经过任何消息循环,也不放入消息队列,直接调用WindowProc,所以GetMessage和PreTranslateMessage都捕获不到;如果SendMessage是向其它线程或其它进程的窗口发消息,则消息进入消息队列,GetMessage和PreTranslateMessage能捕获到这个消息。

 

原创粉丝点击