在输入时抑制成功哔声,但在输入时保留错误哔声
Posted
技术标签:
【中文标题】在输入时抑制成功哔声,但在输入时保留错误哔声【英文标题】:Suppressing success beep sounds on enter, but leave error beep sounds in 【发布时间】:2015-03-23 15:20:25 【问题描述】:我有一个相当大的程序,我需要一种方法来抑制按 Enter 键时发出的所有 Windows 哔声。我找到了一个可以抑制所有哔声的功能,但是当出现问题时我需要发出错误声音,所以这不是一个选项。我看到您可以通过将 Key 设置为 0 来抑制单个文本框的声音,但这不是一个选项,因为我的程序中有很多按键事件。
【问题讨论】:
请您解释一下为什么按 ENTER 会发出哔哔声。在我们确定您遇到这些哔声的原因之前,我们无法告诉您如何抑制它们。 它在退出按钮和回车按钮上执行此操作。这似乎是 Windows 本身内置的一项功能,因为我可以通过 Winapi 调用完全禁用它。它在任何不支持多行输入的文本框上发出哔哔声 【参考方案1】:您可以通过将TForm.KeyPreview
设置为True
,然后添加您的表单的以下OnKeyPress
事件处理程序:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (Key=#13) or (Key=#27) then
Key := #0;
end;
如果您有一些您希望接受 ENTER 或 ESCAPE 的控件,例如多行编辑控件,那么您可以将 KeyPreview
保留为 @987654326 @,并为每个单行编辑控件处理OnKeyPress
:
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
if (Key=#13) or (Key=#27) then
Key := #0;
end;
或者您可以将KeyPreview
保留为True
,然后拥有一个表单范围的OnKeyPress
处理程序,该处理程序根据具有焦点的控件进行区分。例如,一个相当粗略的例子:
function IsSingleLineEdit(Edit: TCustomEdit): Boolean;
var
Style: DWORD;
begin
Style := GetWindowLongPtr(Edit.Handle, GWL_STYLE);
Result := Style and ES_MULTILINE = 0;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (ActiveControl is TCustomEdit)
and IsSingleLineEdit(TCustomEdit(ActiveControl)) then
if (Key=#13) or (Key=#27) then
Key := #0;
end;
但是,我建议您不要做这些事情。我建议您保留当前的行为。如果表单和焦点控件都不会响应这些按键,那么哔哔声是最合适的响应。用户在想要取消当前对话框时按下 ESCAPE。如果您不打算对此做出响应,则系统会发出蜂鸣声以表明这一点。同样,当用户想要接受当前对话框时,她按下 ENTER。同样,由于您的对话框没有响应,因此需要发出哔声。
【讨论】:
【参考方案2】:我看到您可以通过将 Key 设置为 0 来抑制单个文本框的声音,但这不是一个选项,因为我的程序中有很多按键事件。有什么解决办法吗?
这实际上是执行此操作的正确方法,前提是特定的 EditBox 确实具有适当的代码来在按下 Enter 键时执行某些操作。
如果您没有任何特定代码来处理在某个字段中按下 Enter 键时的某些操作,那么应该听到 Ding 的声音来告诉用户他做错了什么。
如果您将特定的编辑框限制为仅数字,也会如此。这样每当用户按下任何字母键时,都会播放 Ding 声音,并且用户知道不允许使用字母。否则用户可能会认为他的键盘有问题。
您不会想成为一个制作软件的人,该软件的使用导致许多键盘被破坏。或者你会吗? :-)
所以恐怕您必须对很多 KeyPress 事件进行大量代码编辑。我必须承认我有点为你感到难过。曾经处于类似的位置。
关于使用表单 KeyPreview 过滤 Enter 和 Escape 键的 David Heffernan 的建议。
不要!真的!不!为什么?
因为这样做可能会干扰其他一些组件的正常功能。
例如,将该代码与 ComboBox 组合使用会阻止您使用 Escape 键折叠展开的组合框。
【讨论】:
if (ActiveControl is TCustomEdit) and IsSingleLineEdit(TCustomEdit(ActiveControl)) then
问问自己一个组合框是否是一个编辑控件。以上是关于在输入时抑制成功哔声,但在输入时保留错误哔声的主要内容,如果未能解决你的问题,请参考以下文章