Я хочу, чтобы обнаружить нажатие 3 ключа в моей форме, например Ctrl +C + N ... набранный форму мне нужно обнаружить всегда начинается с Ctrl и далее идут две буквы.Delphi - Обнаружение нажатия 3 клавиши одновременно
Как я это делаю?
Я хочу, чтобы обнаружить нажатие 3 ключа в моей форме, например Ctrl +C + N ... набранный форму мне нужно обнаружить всегда начинается с Ctrl и далее идут две буквы.Delphi - Обнаружение нажатия 3 клавиши одновременно
Как я это делаю?
По прибытии одного из ключей вы можете посмотреть, был ли другой ключ уже выключен. Например .:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift = [ssCtrl] then begin
case Key of
Ord('C'):
if (GetKeyState(Ord('N')) and $80) = $80 then
ShowMessage('combo');
Ord('N'):
if (GetKeyState(Ord('C')) and $80) = $80 then
ShowMessage('combo');
end;
end;
end;
Однако это будет также обнаружить, например N + Ctrl + C, последовательность, которая не начинается с ключа Ctrl. Если это не относится к действительной комбинации клавиш, вы можете сохранить немного ключевой истории с помощью флага. Далее следует обнаружить только последовательности, которые изначально начинается с Ctrl:
type
TForm1 = class(TForm)
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
FValidKeyCombo: Boolean;
end;
...
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if FValidKeyCombo and (Shift = [ssCtrl]) then
case Key of
Ord('C'):
if (GetKeyState(Ord('N')) and $80) = $80 then
ShowMessage('combo');
Ord('N'):
if (GetKeyState(Ord('C')) and $80) = $80 then
ShowMessage('combo');
end;
FValidKeyCombo := (Shift = [ssCtrl]) and (Key in [Ord('C'), Ord('N')]);
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
FValidKeyCombo := False;
end;
Хорошее редактирование, я не думал об этом. –
@Jerry - я тоже не был :), пока не попробовал код ... –
Я обнаружил, что если я хочу, чтобы Ctrl + C + N отвечал в том же порядке, я должен использовать 'N' с ключом 'case ' и тест 'C' с 'GetKeyState' ... почему это поведение? – Wel
Существует более простой способ:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If (GetKeyState(Ord('Q'))<0) and (GetKeyState(Ord('N'))<0) and (GetKeyState(VK_CONTROL)<0)
Then ShowMessage('You did it :)');
End;
Вы не будете знать, будет ли первая нажатая клавиша «ctrl» или одна из других. Кроме того, это будет по-прежнему соответствовать, когда вы нажимаете совершенно другой ключ после того, как вы нажали три из них. –
Используйте 'TActionManager' –
@Jerry, что не поможет –
@David Ahh ограничения от нескольких буквенных клавиш? –