PreTranslateMessage 与 WindowProc 的关系,谢谢

tsys2000 2007-08-28 05:17:03
PreTranslateMessage 与 WindowProc 的关系,谢谢

如调用的先后等
...全文
924 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wraithtc 2010-05-20
  • 打赏
  • 举报
回复
学习~
winmenaruto 2009-02-14
  • 打赏
  • 举报
回复
好帖
sjdev 2009-02-14
  • 打赏
  • 举报
回复
windows编程之类的书上应该有讲。
每一个Windows程序都会有一个消息循环的(也许api写的对话框程序你看不到消息循环,其实它也是存在的)
PreTranslateMessage看名字能看出来是在TranslateMessage之前处理,而TranslateMessage正是消息循环中要调用的函数。
chunyou128 2009-02-14
  • 打赏
  • 举报
回复
搜到具体位置,在设几个断点看下,会很有收获的。。。
捕鲸叉 2009-02-14
  • 打赏
  • 举报
回复
PreTranlateMessage是线程在将消息递给窗口处理前对消息进行优先操作。
WindowProc就是窗口处理消息的地方。
jameshooo 2008-03-18
  • 打赏
  • 举报
回复
SendMessage要区分环境,如果是对本线程的窗口SendMessage,则不经过任何消息循环,也不放入消息队列,直接调用WindowProc,所以GetMessage和PreTranslateMessage都捕获不到;如果SendMessage是向其它线程或其它进程的窗口发消息,则消息进入消息队列,GetMessage和PreTranslateMessage能捕获到这个消息。
longx 2008-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lisunlin0 的回复:]
MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage…
[/Quote]

好像不对,我没看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产生的消息
ZiSheng 2008-03-17
  • 打赏
  • 举报
回复
up
Tolirry 2008-03-17
  • 打赏
  • 举报
回复
MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。

完全正确!!
kingz1109 2008-03-15
  • 打赏
  • 举报
回复
在深入浅出MFC这本书中,有详细的讲述,去看一下吧!!
hwsts2 2008-03-13
  • 打赏
  • 举报
回复
借用 lisunlin0 的这段恢复]
//=====================
MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和 DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。
//======================
补充
冲Run()的
PreTranslateMessage 这个函数和 PumpMessage 说起
主要做了2件事
1.::TranslateAccelerator 加速键的处理
2. character messages (是不是都从这个入口处理,不太确定)
3.MFC本身对消息的一些特殊处理(有一些WM_COMMAND的转换成WM_NOTFIY)等
4.Thread消息的处理 (CWinThread::PreTranslateMessage)
5.如果我没理解错误的 他还有一种 提前处理一些内部消息的能力(不确定)

WindowProc 基本所有MFC 大部分消息都这里处理


=======================================
lisunlin0 说的GetMessage取不到 SendMessage的消息 是不完全正确的
B Thread 的SendMessage 向 A Thread 的 窗口 WIN_A 发送消息 如进入 A 消息队列的,这个时候GetMessage 就能取出来的


hityct1 2008-03-13
  • 打赏
  • 举报
回复
xuexi
liuzhx911 2008-03-13
  • 打赏
  • 举报
回复
谢谢,正在为这两个函数犯愁呢!
vcstorm 2007-09-26
  • 打赏
  • 举报
回复
楼上正解!
sunlin7 2007-08-28
  • 打赏
  • 举报
回复
MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。
ouyh12345 2007-08-28
  • 打赏
  • 举报
回复
PreTranslateMessage在WindowProc之前调用
shenyi0106 2007-08-28
  • 打赏
  • 举报
回复
一个处理sendmessage发来的消息,一个处理postmessage发来的消息
好象是这样,我调试的时候发现的,不知道是否准确,等待答案.....

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧