При разработке приложения, как для Android, так и для Windows часто требуется обрабатывать нажатия на хардварные и виртуальные кнопки. В среде разработки для этого уже всё предусмотрено, поэтому я просто опишу несколько примеров.
Внимание! Старая версия заметки более не актуальна, т.к. была написана для Delphi XE5/XE6. Это новая версия заметки, актуальна для Delphi 10.3.* и выше. Если вы всё ещё используете версию Delphi ниже 10.3, то рекомендую обновиться на последнюю версию!
Обновление от 15.11.19.
Для кроссплатформенной обработки используются виртуальные ключи. Firemonkey (FMX) преобразует коды клавиш в константы виртуальных ключей, определённых в этой таблице: System.UITypes: Virtual Keys. Для отлова нажатий, отлично подходят методы «KeyDown» и «KeyUp».
Список кодов для часто используемых кнопок:
Список кодов для часто используемых кнопок:
- vkHardwareBack: Integer = $89; - Кнопка «Назад»
- vkVolumeUp: Integer = $AF; - Кнопка «Увеличить громкость»
- vkVolumeDown: Integer = $AE; - Кнопка «Уменьшить громкость»
- vkMenu: Integer = $12; - Кнопка «Меню»
- vkReturn: Integer = $D; - Кнопка «Enter»
Если вам требуется отловить нажатия кнопок на пульте (Android TV), то придётся ознакомиться с материалом ниже.
Delphi 10.3.1 – Часть нажатий на кнопки пульта не отлавливается, ознакомиться с темой «[РЕШЕНО]: Как отловить кнопки пульта ДУ» и там же забрать решение.
Delphi 10.3.2 – проблема исправлена, никаких фиксов не требуется (Подтверждение).
Примеры:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Пример 1 | |
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); | |
begin | |
Memo1.Lines.Add(Format('(Down)-Key: %d Hex: %0:x KeyChar: %s', [Key, KeyChar])); | |
Key := 0; | |
end; | |
// Пример 2 | |
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); | |
begin | |
if Key = vkHardwareBack then | |
begin | |
// Здесь что-то делаем... | |
Key := 0; // Установите Key = 0 если хотите предотвратить действие кнопки по умолчанию | |
end; | |
end; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Это новая версия ответа для Julia N -- 15.11.2019 | |
uses | |
FMX.Platform, FMX.VirtualKeyboard; | |
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); | |
var | |
KeyboardService: IFMXVirtualKeyboardService; | |
begin | |
if Key = vkHardwareBack then | |
if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then | |
if TVirtualKeyBoardState.Visible in KeyboardService.VirtualKeyboardState then | |
Key := 0; | |
end; | |
// Это старая версия. UPD(28.11.13). Ответ на вопрос в комментариях от Julia N: | |
var | |
Form1: TForm1; | |
StatusKeyboard: Boolean = False; | |
implementation | |
{$R *.fmx} | |
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; | |
Shift: TShiftState); | |
begin | |
// HardwareKey - BACK | |
if Key = vkHardwareBack then | |
begin | |
if not StatusKeyboard then begin | |
halt(0); // or MainActivity.finish; | |
end; | |
end; | |
end; | |
procedure TForm1.FormVirtualKeyboardHidden(Sender: TObject; | |
KeyboardVisible: Boolean; const Bounds: TRect); | |
begin | |
StatusKeyboard := False; | |
end; | |
procedure TForm1.FormVirtualKeyboardShown(Sender: TObject; | |
KeyboardVisible: Boolean; const Bounds: TRect); | |
begin | |
StatusKeyboard := True; | |
end; |