Проблема с OnKeyDown в Delphi

Я работаю с Делфи. Я хочу отслеживать, какая клавиша нажата. Я использую событие KeyDown TForm. Он работает нормально, но проблема в том, что, если я нажимаю и строчную букву, она дает мне прописную букву этой буквы. Как я могу распознать нажатую клавишу в нижнем регистре или в верхнем регистре?


person Himadri    schedule 06.08.2010    source источник


Ответы (1)


Если вы хотите отслеживать буквенно-цифровые клавиши, вам следует использовать 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, вставится маленькая буква "а") , проверка, используемая при тестировании столиц,

IsKeyOn(VK_CAPITAL) xor IsKeyDown(VK_SHIFT)

с помощью оператора xor.)

person Andreas Rejbrand    schedule 06.08.2010
comment
Хорошо, спасибо за этот код, можете ли вы сказать мне, что означают $8000 <> 0 и 1=1 в обеих функциях? - person Himadri; 06.08.2010
comment
GetKeyState возвращает кардинальное число, в котором биты являются флагами, поэтому с помощью операции and я очищаю все биты, кроме интересующего, а затем проверяю, равен ли результат нулю или нет. То есть GetKeyState(VK) and $8000 <> 0 следует читать (GetKeyState(VK) and $8000) <> 0, где 8000 в шестнадцатеричном формате — это 10000000000000000 в двоичном формате. Все это хорошо задокументировано: msdn.microsoft.com/ en-us/library/ms646301(VS.85).aspx - person Andreas Rejbrand; 06.08.2010
comment
да, я уже прочитал это, но я не получил возвращаемого значения. Что такое младший бит, старший бит? - person Himadri; 06.08.2010
comment
GetKeyState возвращает 16-битное число со знаком. Внутренне это представлено в виде строки из 16 двоичных цифр (битов, единиц и нулей). Например, 0000010100001011 представляет число 1291. Старший бит — это первый бит (0 в этом примере), а последний бит — последний бит (в этом примере 1). Таким образом, возвращаемое значение GetKeyState не следует интерпретировать как число (например, 1291) в двоичном формате, а скорее как строку флагов, включенных (1) или выключенных (0). Итак, если функция возвращает 1000000000001001 или что-то еще, где первый бит равен 1, то ключ нажат. - person Andreas Rejbrand; 06.08.2010
comment
О, вот почему вы проверяете разные вещи в обоих условиях. Спасибо за ответ, а также за то, что развеяли мои сомнения. + 1. - person Himadri; 06.08.2010