You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:08:13