首先只对 MFC 的对话框有效, MFC 的模态对话框并不是真正的模态对话框. 对 WM_KEYDOWN 消息也是在框架代码内的. 对真正 API 的 DialogBox 对话框, 永远无法收到 WM_KEYDOWN 消息了.
MFC 本身提供了 PreTranslateMessage 可以捕捉 WM_KEYDOWN 消息, 但是当对话框有子窗口时, 即使这个子窗口是隐藏的, 由于焦点等问题也可能会捕捉不到 WM_KEYDOWN 消息.
这时可以使用此方法, 在任意一个 cpp 文件中加入这个函数:
BOOL __cdecl AfxPreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
AfxMessageBox("s");
}
CWinThread *pThread = AfxGetThread();
if( pThread )
return pThread->PreTranslateMessage( pMsg );
else
return AfxInternalPreTranslateMessage( pMsg );
}
这时会产生一个链接错误, 在链接选项中加 /FORCE:MULTIPLE 选项可以把它变成警告, 然后正常生成可执行文件了.
至于扑捉到消息后怎么分发就看你自己了.
› 网友 VC佳佳 () 于 2014-09-02 17:05:39 发表评论说:
你好,我也遇到这个问题了。经过我调试发现,普通的按键消息(WM_KEYDOWN)都变成了WM_SYSKEYDOWN,由于框架默认都处理系统按键消息,则用户端的代码就处理不到了。不知道你是不是也有这个发现,具体我还不知道如何解决,谢谢