如何让MFC对话框程序中PreTranslateMessage仅执行一次?
解决MFC计算器键盘输入重复问题
你的问题核心是没有区分消息类型且未拦截已处理的消息,导致同一个按键操作被多次处理,同时系统默认消息处理也会向编辑框输入字符,最终出现重复内容。
修复代码
BOOL PreTranslateMessage(MSG *pMsg) { // 仅处理WM_CHAR消息(对应实际的字符输入),且匹配按键'1' if(pMsg->message == WM_CHAR && pMsg->wParam == '1') { UpdateData(TRUE); AddNextCharToValue(_T("1")); UpdateData(FALSE); // 返回TRUE,告知系统该消息已被处理,无需再走默认流程 return TRUE; } return CDialog::PreTranslateMessage(pMsg); }
关键说明
- 消息类型判断:
WM_CHAR是按键最终生成字符的消息,避免WM_KEYDOWN(按住按键会重复触发)或其他消息导致多次处理。 - 拦截消息:处理完后返回
TRUE,阻止系统将该按键消息继续传递给编辑框,避免编辑框自身再输入一次字符。
如果要支持更多数字按键,可以扩展判断逻辑,比如:
if(pMsg->message == WM_CHAR && isdigit(pMsg->wParam)) { CString str; str.Format(_T("%c"), pMsg->wParam); UpdateData(TRUE); AddNextCharToValue(str); UpdateData(FALSE); return TRUE; }
内容的提问来源于stack exchange,提问作者Mikołaj Nawrocki
相关产品推荐
相关产品推荐

