在输入时抑制成功哔声,但在输入时保留错误哔声

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;

如果您有一些您希望接受 ENTERESCAPE 的控件,例如多行编辑控件,那么您可以将 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 问问自己一个组合框是否是一个编辑控件。

以上是关于在输入时抑制成功哔声,但在输入时保留错误哔声的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 PHP Web 开发中获得哔声?

如何在尝试输入超过允许的字符时禁用 TextBox 的哔声

击中钥匙时发出不必要的哔声

在python中的错误点使用哔声

Java 错误提示音

iOS 为条码扫描器添加哔哔声