我正在编写一个从tExCustomControl派生的自定义按钮,而该按钮又是从tCustomControl派生的。tExCustomControl组件负责绘画,并有一个用于标题显示的内部tLabel(我选择tLabel是为了方便快捷键字符的底层)。在tExCustomControl中,我处理"keyUp"事件,如下所示:
if Char (Key) = AcceleratorChar then
if AltKeyIsDown then
if Assigned (OnClick) then
OnClick (Self);
这很好,除了一件事:在按住Alt键的同时,在按下并重新松开加速键后,我会听到"输入错误"的声音。
为什么播放这个声音?我该如何避免这种情况?
提前谢谢。
当按下Alt键同时按下另一个键时,系统会生成一个WM_SYSKEYDOWN
,然后通过TranslateMessage
函数将其转换为WM_SYSCHAR
。"嘟嘟"是由该消息的默认处理引起的,该消息通常仅用于系统菜单快捷键。
您可以阻止对消息的进一步处理,以防止嘟嘟声。当你在那里的时候,你也可以处理钥匙。
procedure tMyExCustomControl.WMSysChar(var Message: TWMSysChar);
begin
if Message.CharCode = Ord(AcceleratorChar) then
OnClick(Self)
else
inherited;
end;
问题出在充当标题的tLabel上。它收到消息,但由于没有设置焦点控制,Windows发出叮当声。将焦点控制设置为tExButton可解决此问题。事实上,ding是在形式级别播放的,因此,在tExCustomControl中的KeyUp事件之前。这就是tExCustomControl没有消息要处理的原因,它们已经被表单处理了。