A!die Software Studio Welcome to A!Die Software Studio

MFC 对话框收不到 WM_KEYDOWN 消息的终极解决办法(很变态)

by adie
2011-05-12 15:15:12

首先只对 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,由于框架默认都处理系统按键消息,则用户端的代码就处理不到了。不知道你是不是也有这个发现,具体我还不知道如何解决,谢谢

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:
验 证:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com