基于 CDialog 的 MFC 程序无法响应键盘消息

自己写一个继承了 CDialog 的类,然后响应 WM_KEYDOWN 消息,发现无论按什么键都不响应,需要重写 PreTranslateMessage 方法,在这个方法中处理 WM_KEYDOWN,至于原因,网上有很多解释,这里就不展开讨论。但是如果程序有多个对话框类且每个都要响应 WM_KEYDOWN,那要写一堆 PreTranslateMessage,导致重复代码太多。这里有一个更简单的方法。

    因为消息的传递是先从 CWinApp 再到 CDialog,所以可以重写 CWinApp 的 PreTranslateMessage,在这个方法里,将消息发给最前面的窗口就可以了,代码如下。

BOOL CTestMFCApp::PreTranslateMessage(MSG* pMsg) {
if (pMsg->message == WM_KEYDOWN) {
CWnd* pWnd = CWnd::FromHandle(GetForegroundWindow());
if (pWnd != nullptr) {
pWnd->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
}
return TRUE;
}
return CWinApp::PreTranslateMessage(pMsg);
}
然后对话框的 OnKeyDown 就能响应了。

全文完。

posted @ 2025-07-06 16:46  安联酋长  阅读(19)  评论(0)    收藏  举报