我想在我的表单中检测按下三个键,例如 Ctrl+C+N... 我需要检测的输入表单始终以 Ctrl 开头,接下来是两个字母。
我该如何做到这一点?
我想在我的表单中检测按下三个键,例如 Ctrl+C+N... 我需要检测的输入表单始终以 Ctrl 开头,接下来是两个字母。
我该如何做到这一点?
当其中一个键到达时,您可以查看另一个键是否已经按下。例如:
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;
case key of
中使用'N'并使用GetKeyState
测试'C'....为什么会这样? - zac 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;
TActionManager
。 - Jerry Dodge