c ++ winapi - 子类化编辑控件 - 单击“Enter”时发出烦人的声音
Posted
技术标签:
【中文标题】c ++ winapi - 子类化编辑控件 - 单击“Enter”时发出烦人的声音【英文标题】:c++ winapi - subclassing an edit control - annoying sound when clicking "Enter" 【发布时间】:2014-04-25 14:51:28 【问题描述】:当有人单击“Enter”时,我制作了一个能够接受数据的编辑控件。我使用子类化来做到这一点。它工作得几乎完美。但是点击“Enter”后,系统每次都会播放“Error”的声音。我尝试使用 ES_MULTILINE 和 ES_AUTOVSCROLL 绕过它,但它有部分帮助。现在点击“回车”后没有声音,但在文本框中出现了无用的“回车”字符,无法删除。 如何绕过系统声音?或者从该文本框中删除“Enter”字符(SetWindowText(handle, "") 没有帮助)。
【问题讨论】:
你试过ES_WANTRETURN
吗?
它会发出哔哔声,因为在非多行的编辑控件中按 Enter 是没有意义的。 Enter 保留用于操作窗口的默认控件,如 OK 按钮。你为什么按无用的键?应该发生什么?
@nwp - ES_WANTREURN 没有改变任何东西。
@Hans Passant - 按无用的键是什么意思?我想以方便的方式确认数据,而不是使用鼠标单击按钮。
@HansPassant:我经常收到客户的请求,即按 Enter 键应该关注下一个编辑字段。特别是如果该程序要替换旧的文本模式数据输入应用程序。用户不关心 Windows UI 指南,他们希望按键序列保持不变,肌肉记忆等等。
【参考方案1】:
您不需要ES_MULTILINE
、ES_AUTOVSCROLL
或ES_WANTRETURN
样式标志。
要阻止单行编辑控件在 VK_RETURN
上发出哔哔声,您需要处理该控件的 WM_CHAR
消息并为 VK_RETURN
返回 0,而不调用默认窗口过程,该过程必须为所有人调用其他键。
【讨论】:
您不需要处理WM_KEYDOWN
消息。如果您不处理WM_KEYDOWN
,默认处理(通过调用TranslateMessage
)将产生一条或多条WM_CHAR
消息。处理WM_CHAR
足以防止发出哔哔声。
见How to turn off beeping when pressing ENTER on a single-line EDIT control under Windows CE?代码示例。【参考方案2】:
我从 WinAPI Reference 中了解到,WM_CHAR
的默认编辑处理会调用 MessageBeep
函数来处理非法字符,例如 enter 和 tab。我通过截取WM_KEYDOWN
将编辑控件子类化为控件之间的制表符(如 Petzold 所示的滚动条),但是当我按下制表符时它会发出哔哔声。所以我拦截WM_CHAR
以避免在我按tab时默认处理,所以停止哔哔声。
【讨论】:
以上是关于c ++ winapi - 子类化编辑控件 - 单击“Enter”时发出烦人的声音的主要内容,如果未能解决你的问题,请参考以下文章