【问题标题】:Delphi - Detect pressing 3 keys at the same timeDelphi - 检测同时按下3个键
【发布时间】:2013-02-17 21:47:16
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 使用TActionManager
  • @Jerry 帮不上忙
  • @David Ahh 对多个字母键的限制?

标签: delphi


【解决方案1】:

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

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 以相同的顺序响应,我必须使用 'N' 和 case key of 并测试 'C' 和 GetKeyState....为什么那种行为?
  • @Well - 不客气。如果“N”将是最后一个键,那么当事件处理程序运行“N”时,“C”应该已经被按下。这就是我们使用“GetKeyState”检查的内容,如果“C”已关闭。
【解决方案2】:

还有更简单的方法:

    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”还是其他键。此外,当您按下三个完全不同的键后,这仍然符合条件他们。
猜你喜欢
  • 1970-01-01
  • 2019-05-21
  • 2012-01-22
  • 2017-02-16
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多