у меня есть 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 (и TListView имеет фокус), любой ввод символов запускает метод «выбрать типизированный элемент», который пытается найти и выбрать элемент с помощью нашего ввода.
Это был ответ, который меня интересовал. Для работы однокнопочных горячих клавиш я использовал следующий код:
void __fastcall Tmform::FormKeyPress(TObject *Sender, System::WideChar &Key)
{
if(Key == L's' || Key == L'ы' || Key == L'i')
Panel1->Color = RGB(random(255),random(255),random(255)) ;
Key = 0;
}
РЕДАКТИРОВАТЬ: я нашел лучшее решение для этой проблемы. Вместо строки:if(Key == L's' || Key == L'ы' || Key == L'i')
Я использовал это: if(GetAsyncKeyState(vkS))
Он работает практически со всеми существующими раскладками клавиатуры ПК.
! Он не будет работать должным образом, если у вас есть раскладка Dvorak (или немецкий) и стандартная клавиатура QWERTY.
Спасибо за помощь!
Других решений пока нет …