Delphi Alt 键 + 加速键播放 "wrong entry" 声音

Delphi Alt key + accelerator key plays a "wrong entry" sound

我正在编写一个派生自 tExCustomControl 的自定义按钮,而后者又派生自 tCustomControl。 tExCustomControl 组件负责绘画并有一个用于标题显示的内部 tLabel(我对 tLabel 的选择是为了促进加速器字符的底层)。在 tExCustomControl 中,我这样处理 "keyUp" 事件:

      if Char (Key) = AcceleratorChar then
          if AltKeyIsDown then
              if Assigned (OnClick) then
                 OnClick (Self);

这工作正常,除了一件事:按住 Alt 键并按下并释放加速键后,我听到 "wrong entry" 声音。

为什么会播放这个声音?我怎样才能避免这种情况?

提前致谢。

当按下 Alt 键的同时按下另一个键时,系统会生成一个 WM_SYSKEYDOWN,然后由 TranslateMessage 函数将其转换为 WM_SYSCHAR。 'beep' 是由此消息的默认处理引起的,该消息通常仅用于系统菜单加速器。

您可以阻止进一步处理消息以防止发出提示音。当你在那里时,你也可以处理密钥。

procedure tMyExCustomControl.WMSysChar(var Message: TWMSysChar);
begin
  if Message.CharCode = Ord(AcceleratorChar) then
    OnClick(Self)
  else
    inherited;
end;

问题出在充当标题的 tLabel 上。它收到消息,但是,由于没有设置焦点控制,Windows 发出叮当声。将焦点控件设置为 tExButton 可以解决问题。事实上,叮铃音是在表单级别播放的,因此在 tExCustomControl 中的 KeyUp 事件之前播放。这就是为什么 tExCustomControl 没有消息要处理的原因,它们已经被表单处理过。