触发 KeyDown 时发出蜂鸣声

Beeping while KeyDown is triggered

我的表单上有一个 TListView(它一直处于焦点状态)和一个 OnKeyDown 事件处理程序(它的 KeyPreview 属性 为真)。

playlist 是我的 TListView 组件 (Style = vsReport).

void __fastcall Tmform::mformKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if(Shift.Contains(ssCtrl))            // hotkeys with CTRL
  {
     switch(Key)
     {
        case vkF: findDoublesbtnClick(mform);  break;        // [FIND TWINS]
        case vkD: dbsClick(mform);             break;        // [DELETE BAD SONGS]
        case vkA: playlist->SelectAll();       break;        // [CTRL + A]
        case vkS: settingsClick(mform);        break;        // [SETTINGS]
     }
  }
  else                                  // just keys
  {
     switch(Key)
     {
        case vkReturn:  if(playlist->SelCount) pl.refreshSong();        break;   // [ENTER]
        case vkDelete:   af.deleteFiles();      break;        // [DELETE]
        case vkSpace:
        case vkNumpad3:  pl.playPauseResume();  break;
        case vkSubtract: prevbtnClick(mform);   break;        // [PREVIOUS]
        case vkAdd:      nextbtnClick(mform);   break;        // [NEXT]
        case vkC:        counterClick(mform);   break;        // [LISTENINGS WIN]
     }
}

为什么我按任意键(TListView 聚焦)时它会发出蜂鸣声?

所以,我发现,为什么 它会发出哔哔声。这似乎是 TListView 组件的标准行为。当 TListView 中的一个项目被 select 编辑(并且 TListView 有焦点)时,任何字符输入都会触发 "select the typed item" 方法,该方法试图通过我们的输入查找和 select 项目。

这是我感兴趣的答案。为了制作工作热键(包括一键),我使用了下一个代码:

void __fastcall TForm1::ListViewKeyPress(TObject *Sender, System::WideChar &Key)
{  Key = 0; }     // here TListView calls "find" method. I reset Key value,
                  // thus I have only vkCode for FormKeyDown which triggers
                  // after FormKeyPress
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Shift.Contains(ssAlt) && Key == vkF)                // use any key or shortcut
    {  Form1->Color = RGB(random(255), 0, 0);  return; }    // you wish
    if (Key == vkF)
       Form1->Color = RGB(0, random(255), 0);
    if (Key == vkSpace)
       Form1->Color = RGB(0, 0, random(255));
}

它适用于所有现有的 PC 键盘布局。但是使用 'alt' 和 'win' 键仍然会发出哔哔声,因为任何键 使用 'alt' 或 'win' 不会触发 ListViewKeyPress 事件。

感谢您的帮助!