在 MFC 中,非活动窗口是不是接收 PreTranslateMessage 事件?

Posted

技术标签:

【中文标题】在 MFC 中,非活动窗口是不是接收 PreTranslateMessage 事件?【英文标题】:In MFC, do inactive windows receive PreTranslateMessage events?在 MFC 中,非活动窗口是否接收 PreTranslateMessage 事件? 【发布时间】:2015-04-29 20:08:30 【问题描述】:

我注意到一种行为,并想确认没有简单的方法可以解决它。假设我有一个主 CFrameWnd,它包含几个 CView,通常嵌套几个层次。假设他们每个人都覆盖PreTranslateMessage(MSG* pMsg)(不要开枪,我继承了这个代码:P)。问题是:所有的 CViews / CFrameWnd / 等都会收到通知到他们的PreTranslateMessage(MSG* pMsg),还是由第一个处理它的PreTranslateMessage(MSG* pMsg) 消费的消息?

根据我的观察,似乎只有一个PreTranslateMessage(MSG* pMsg) 被触发,但我想确认一下。

【问题讨论】:

【参考方案1】:

如果发布到 Windows 消息队列的消息用于该视图或该视图的子窗口,则非活动视图将收到 PreTranslateMessage 调用。

如果消息不满足上述条件,则非活动视图不会处理 PreTranslateMessages。

有 PreTranslateMessage 和菜单、工具栏、功能区等的 OnCmdMsg 路由。在这种情况下,非活动视图默认不会处理它们,除非应用程序框架窗口已覆盖 OnCmdMsg 并决定遍历所有子级意见。

【讨论】:

以上是关于在 MFC 中,非活动窗口是不是接收 PreTranslateMessage 事件?的主要内容,如果未能解决你的问题,请参考以下文章

VC++ 非 mfc 中的父子窗口问题

在分割视图中怎么不能响应菜单消息呢

如何在 mfc 的 OnCreate 方法中停止创建窗口

如何在 MFC 中创建非交互式窗口

MFC怎么知道哪个窗口对应的哪个类

如何在MFC中创建非交互式窗口