Звуковой сигнал при срабатывании KeyDown - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть TListView (он постоянно фокусируется) и обработчик событий OnKeyDown в моей форме (его свойство KeyPreview имеет значение true).

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)?

1 Ответ

0 голосов
/ 29 ноября 2018

Итак, я выяснил, почему издает звуковой сигнал.Кажется, это стандартное поведение компонента TListView.Когда выбран один элемент в TListView (и TListView имеет фокус), любой ввод символов запускает метод «выбрать типизированный элемент», который пытается найти и выбрать элемент с помощью нашего ввода.

Это был ответ, который меня интересовал.Для работы горячих клавиш (включая одноклавишный) я использовал следующий код:

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));
}

Он работает со всеми существующими раскладками клавиатуры ПК.Но с клавишами «alt» и «win» все еще подается звуковой сигнал, потому что любая клавиша с «alt» или «win» не вызывает событие ListViewKeyPress.

Спасибо за вашу помощь!

...