Если вы хотите отслеживать буквенно-цифровые клавиши, то вам следует использовать KeyPress
. Попробуйте это:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage(Key);
end;
Проблема с KeyDown
заключается в том, что она реагирует на нажатие клавиши и, конечно же, если вы хотите ввести «K» или «k» на клавиатуре, вы нажимаете ту же кнопку, верно? Так что если вы хотите придерживаться KeyDown
, то вам нужно отдельно проверить, включена ли клавиша Caps Lock или нажата клавиша Shift. Чтобы проверить, включена ли клавиша переключения (например, Caps Lock) или нажата обычная клавиша, вы можете использовать
function IsKeyDown(const VK: integer): boolean;
begin
IsKeyDown := GetKeyState(VK) and $8000 <> 0;
end;
function IsKeyOn(const VK: Integer): boolean;
begin
IsKeyOn := GetKeyState(VK) and 1 = 1;
end;
Чтобы проверить, включена ли клавиша Caps Lock, используйте IsKeyOn(VK_CAPITAL)
. Чтобы проверить, нажата ли клавиша Shift, используйте IsKeyDown(VK_SHIFT)
.
Альтернативный способ проверки нажатия клавиши Shift, которая работает только в обработчике событий OnKeyDown
, заключается в проверке, является ли ssShift in Shift
, где Shift
- параметр этой функции обработчика событий.
(Кстати, потому что действию включения Caps Lock противодействует клавиша Shift (то есть, если вы нажимаете Shift + A при включенном Caps Lock, small"a" вставлен), чек для использования при тестировании на столицы
IsKeyOn(VK_CAPITAL) xor IsKeyDown(VK_SHIFT)
с использованием оператора xor.)