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

Suppressing success beep sounds on enter, but leave error beep sounds in

我有一个相当大的程序,我需要一种方法来抑制按 Enter 键时发出的所有 Windows 哔声。我找到了一个可以抑制所有哔声的功能,但是当出现问题时我需要发出错误声音,所以这不是一个选项。我看到您可以通过将 Key 设置为 0 来抑制单个文本框的声音,但这不是一个选项,因为我的程序中有很多按键事件。


您可以通过将 TForm.KeyPreview 设置为 True 然后为您的表单添加以下 OnKeyPress 事件处理程序来抑制当编辑控件具有焦点并按下 ESCAPEENTER 时产生的这些哔声:

1
2
3
4
5
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (Key=#13) or (Key=#27) then
    Key := #0;
end;

如果您有一些您希望接受 ENTERESCAPE 的控件,例如多行编辑控件,那么您可以将 KeyPreview 保留为 False,并为每个单行编辑控件处理 OnKeyPress :

1
2
3
4
5
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
  if (Key=#13) or (Key=#27) then
    Key := #0;
end;

或者您可以将 KeyPreview 保留为 True,然后拥有一个表单范围的 OnKeyPress 处理程序,该处理程序根据具有焦点的控件进行区分。例如,一个相当粗略的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。同样,由于您的对话框没有响应,因此发出哔声是合适的。


I saw you could surpress the sound for a single textbox by setting the Key to 0, but this is not an option as there are a LOT of keypress events in my program. Is there any solution to this?

这实际上是执行此操作的正确方法,前提是特定的 EditBox 确实具有适当的代码来在按下 Enter 键时执行某些操作。

如果您没有任何特定代码来处理在某些字段中按 Enter 键时的某些操作,那么应该听到 Ding 的声音来告诉用户他做错了什么。

如果您将特定的编辑框限制为仅数字,也会如此。这样每当用户按下任何字母键时,都会播放 Ding 声音,并且用户知道不允许使用字母。否则用户可能会认为他的键盘有问题。

您不会想成为一个制作软件的人,该软件的使用导致许多键盘被破坏。或者你会吗? :-)

所以我担心您将不得不为很多 KeyPress 事件进行大量代码编辑。我必须承认我有点为你感到难过。曾经处于类似的位置。

关于使用表单 KeyPreview 过滤 Enter 和 Escape 键的 David Heffernan 的建议。

不要!真的!别!为什么?

因为这样做可能会干扰其他一些组件的正常功能。

例如,将该代码与 ComboBox 组合使用会阻止您使用 Escape 键折叠展开的组合框。