2015-06-27 4 views
2

Начало нового приложения VCL, падение TEdit на форме и назначить это OnKeyPress событие:Есть ли способ остановить раздражающее поколение события OnKeyPress с управляющими символами, когда нажата комбинация клавиш Ctrl + «some key»?

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
Caption:=Caption+' '+IntToStr(Ord(Key)); 
end; 

При запуске приложения и нажмите, например, Ctrl + M или Ctrl + H вы получите контроль символы # 13 (Enter) и # 8 (Backspace) в поле Key OnKeyPress. Есть ли способ остановить это раздражающее поведение? Я имею в виду полностью прекратить прием OnKeyPress, когда я нажимаю быстрые клавиши, такие как Ctrl + M, не тестируя Ctrl и ничего не делая внутри события. Я хочу, чтобы мое приложение обрабатывало клавишу Enter, когда клавиша Enter нажата не Ctrl + M. Я надеюсь, вы понимаете, о чем я говорю ...

+0

http://stackoverflow.com/questions/10305634/ctrlbackspace-in-delphi-controls –

+0

Если я использую 'SHAutoComplete', я больше не получаю # 13, когда я нажимаю Enter. –

+0

Событие OnKeyPress не учитывает специальные клавиши, такие как 'Ctrl',' Alt' или 'Shift'. Если вы хотите обнаружить, когда одна из них нажата, вам нужно начать использовать события OnKeyDown или OnKeyUp. – SilverWarior

ответ

4

OnKeyDown/Up В события (WM_KEYDOWN/UP сообщения) получать индивидуальные комбинации клавиш, сообщая коды виртуальных клавиш, которые были переведены из физических кодов сканирование клавиатуры в драйвером клавиатуры.

OnKeyPress событие (WM_CHAR сообщение) получает переведенные символы после виртуальные клавиши и комбинации клавиш были обработаны (если они переводят в символ на всех).

CTRL-M является переводится в возврат каретки (# 13) символов.

Ctrl-H является переводится в забой (# 8) символов.

Этот перевод происходит на уровне ОС, когда контуры сообщений передают сообщения клавиатуры функции TranslateMessage() перед вызовом DispatchMessage().

Смотрите следующую таблицу для того, как различные пересчитываются CTRL сочетание:

Control key - examples

Также см Character Messages для более подробного объяснения, как WM_KEYDOWN/UP сообщения переводятся в WM_CHAR сообщений.

Таким образом, различие между CTRL-M и ENTER в OnKeyPress случае, вы должны либо:

  1. использовать OnKeyDown/Up события, чтобы отслеживать, когда CTRL (VK_CONTROL) и M (VK_M) виртуальные клавиши отжимаются по сравнению с ENTER (VK_RETURN) virtual ke y нажата.

  2. Использование GeyKeyState() или GetAsyncKeyState() обнаружить, если CTRL-M ключи удерживаются против, если ENTER клавиша удерживается в нажатом положении.

В противном случае не используйте OnKeyPress. Используйте вместо этого OnKeyDown/Up и при необходимости выполните собственное манипулирование клавиатурой.

+0

Да, 'OnKeyDown' кажется лучшим способом избежать этих путаниц. –

+0

Лучше, чем ссылка в Википедии может быть [это] (https://www-user.tu-chemnitz.de/~ygu/petzold/ch06d .htm). Только несколько ярлыков фактически переведены в 'WM_CHAR' (они перечислены там в таблице). [скоро удалит этот комментарий] – TLama

+0

Эта ссылка имеет ненадежный сертификат безопасности. –

 Смежные вопросы

  • Нет связанных вопросов^_^