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_MULTILINEES_AUTOVSCROLLES_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”时发出烦人的声音的主要内容,如果未能解决你的问题,请参考以下文章

子类化组合框时如何抑制自动搜索(Win32/WinAPI)

WinAPI 中的编辑控件文本无法更改

不破坏复制/粘贴的子类编辑控件

如何更改静态文本控件(winapi)的字体?

.NET 中 ActiveX 控件的子类化窗口过程

在 C++/WinAPI 程序中读取 Trackbar 控件值