A. Создайте приложение VCL Forms.Управление ключами с KeyPreview в TForm.OnKeyDown не работает с TListBox
B. Поместите TListBox на форму и заполнить некоторые предметы в режиме разработки, например:
C. установить форму в KeyPreview
собственности на True
:
D. В форме OnKeyDown
обработчик события написать этот код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_BACK then
begin
if ListBox1.Focused then
begin
Key := 0;
CodeSite.Send('ListBox1 is focused!');
end;
end;
end;
E. Запустите программу и выберите Item5, нажав на нее:
Теперь ListBox1 имеет фокус.
F. Теперь нажмите клавишу BACKSPACE. Предположительно, установка Key := 0;
в обработчике событий формы OnKeyDown
должна блокировать ключ BACKSPACE от обработки элементом управления ListBox1. Но это не работает, как вы можете увидеть: Ключ BACKSPACE причиненный изменить выбор из Item5 в ITEM1:
Так как я могу предотвратить ключ BACKSPACE из обработки в сфокусированного управления ListBox и изменить выбор ListBox?
Delphi 10,1 Berlin Update 2
Windows 7 x64 SP1
Подробнее о WM_GETDLGCODE –
@DavidHeffernan: И какое значение вы бы предложили вернуться из этого сообщения? Нет знака, который говорит, чтобы игнорировать нажатия клавиш в обратном направлении. Вы думаете об отключении флагов 'DLGC_WANTALLKEYS' и/или' DLGC_WANTCHARS' или включении флага 'DLGC_WANTMESSAGE'? Вы должны быть более конкретными. –
TranslateMessage вызывается до DispatchMessage в цикле сообщений, поэтому вы не помешали WM_CHAR (который был переведен из WM_KEYDOWN), чтобы его можно было отправить в список. Отсюда ответ Реми .... –