Visual c++ can';当在';预译信息';功能

Visual c++ can';当在';预译信息';功能,visual-c++,Visual C++,出于某种原因,当我在PreTranslateMessage中获得WM_KEYDOWN message时,我需要做一些事情,所以我会这样做: if(WM_KEYDOWN == pMsg->message && pMsg->hwnd == GetSafeHwnd()) { SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); return TRUE; }

出于某种原因,当我在
PreTranslateMessage
中获得
WM_KEYDOWN message
时,我需要做一些事情,所以我会这样做:

if(WM_KEYDOWN == pMsg->message && pMsg->hwnd == GetSafeHwnd())
{      
     SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
     return TRUE;       
}
void YourWnd::PreTranslateMessage(MSG *pMsg)
{
    if(WM_KEYDOWN == pMsg->message && pMsg->hwnd == GetSafeHwnd())
    {      
         processKeyDown();      
    }
    return CWnd::PreTranslateMessage(pMsg);
}
这样做之后,我发现没有办法进入
OnChar
函数,这很糟糕。
有人知道为什么以及如何解决这个问题吗?非常感谢您的帮助。

当您从PreTranslateMessage()返回TRUE时,消息将不会被进一步处理。每次击键都要这样做,因此不会处理任何键,也永远不会生成WM_CHAR消息。换句话说,你得到了你想要的。看起来你也在向自己发送信息。很难提出替代方案,代码没有意义。

为什么要向自己发送相同的消息?如果您只想做一些处理并让消息通过,那么在“If”语句中需要做的就是进行处理并让正常的消息链接工作。这样,消息将被发送以进行进一步处理,并最终到达onChar

所以你的代码应该是这样的:

if(WM_KEYDOWN == pMsg->message && pMsg->hwnd == GetSafeHwnd())
{      
     SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
     return TRUE;       
}
void YourWnd::PreTranslateMessage(MSG *pMsg)
{
    if(WM_KEYDOWN == pMsg->message && pMsg->hwnd == GetSafeHwnd())
    {      
         processKeyDown();      
    }
    return CWnd::PreTranslateMessage(pMsg);
}

为什么要预先翻译信息?你有什么可能的理由在预翻译信息中这样做

PreTranslateMessage,顾名思义,指包含热键/快捷键的PreTranslate消息。 经常用它作为某种绷带,迟早会导致灾难


你能告诉我们你想达到什么目标吗?有人会想出更好的解决方案。

它是基于对话框的应用程序吗?您的预翻译消息和OnChar在dialog类中?我们知道“DLL中的无模式对话框不处理TAB键”,我使用了一些厚实的函数,使“PreTranslateMessage”函数可以获得向下键的消息,因此我将消息发送给自己。非常感谢,我在阅读了“OnChar”主题后得到了答案,我之所以将消息发送到它自己,是因为我很久以前就编写了正确的函数来处理键关闭消息,但是当我在无模式对话框上显示控件时,我发现它无法正确处理它,所以我使用GetMessage钩子来调度PreTranslateMsg函数,并像这样处理键关闭消息。