我编写了一个从tExCustomControl派生的自定义buttonn,而后者又来自tCustomControl。 tExCustomControl组件负责绘制并具有内部tLabel用于标题显示(我的选项是tLabel用于促进加速器char的底层)。在tExCustomControl中,我处理" keyUp"像这样的事件:
if Char (Key) = AcceleratorChar then
if AltKeyIsDown then
if Assigned (OnClick) then
OnClick (Self);
这样做很好,除了一件事:按住Alt键并按下并重新加载加速键后,我得到一个错误的条目"声音。
为什么会播放此声音?我怎么能避免这个?
提前致谢。
答案 0 :(得分:2)
当按下Alt键同时按下另一个键时,系统会生成WM_SYSKEYDOWN
,然后WM_SYSCHAR
功能将其翻译为TranslateMessage
。 “哔”是由此消息的默认处理引起的,该消息通常仅用于系统菜单加速器。
您可以阻止进一步处理消息以防止发出哔声。当你在那里时,你也可以处理密钥。
procedure tMyExCustomControl.WMSysChar(var Message: TWMSysChar);
begin
if Message.CharCode = Ord(AcceleratorChar) then
OnClick(Self)
else
inherited;
end;
答案 1 :(得分:0)
问题在于tLabel充当标题。它接收消息但是,由于没有设置焦点控制,Windows发出声音。将焦点控制设置为tExButton可以解决问题。事实上,ding是在表单级别播放的,因此,在tExCustomControl中的KeyUp事件之前。这就是为什么tExCustomControl没有要处理的消息的原因,它们已经由表单处理过了。