Я работаю с Делфи. Я хочу отслеживать, какая клавиша нажата. Я использую событие KeyDown TForm. Он работает нормально, но проблема в том, что, если я нажимаю и строчную букву, она дает мне прописную букву этой буквы. Как я могу распознать нажатую клавишу в нижнем регистре или в верхнем регистре?
Проблема с OnKeyDown в Delphi
Ответы (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.)
$8000 <> 0
и 1=1
в обеих функциях?
- person Himadri; 06.08.2010
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