Delphi - 检测同时按下3个键

8

我想在我的表单中检测按下三个键,例如 Ctrl+C+N... 我需要检测的输入表单始终以 Ctrl 开头,接下来是两个字母。

我该如何做到这一点?


使用 TActionManager - Jerry Dodge
@Jerry 那样做没有帮助。 - David Heffernan
@David 啊,多字母键的限制? - Jerry Dodge
2个回答

18

当其中一个键到达时,您可以查看另一个键是否已经按下。例如:

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;

我发现如果我想让Ctrl+C+N按相同的顺序响应,我必须在case key of中使用'N'并使用GetKeyState测试'C'....为什么会这样? - zac
@好的 - 不用谢。如果“N”是最后一个按键,那么当事件处理程序运行“N”按下时,“C”应该已经被按下了。这就是我们使用“GetKeyState”检查“C”是否按下的原因。 - Sertac Akyuz

4
有更简单的方法:
    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”还是其他键之一。此外,当你在按下这三个键之后按下完全不同的键时,它仍然会被识别为组合键。 - Sertac Akyuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接