德尔福 - 检测同时按下3个键

时间:2013-02-17 21:47:17

标签: delphi

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

我是怎么做到的?

2 个答案:

答案 0 :(得分:16)

当其中一个键到达时,您可以查看另一个键是否已经关闭。 E.g:

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 ,这个序列不以< kbd> 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;

答案 1 :(得分: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;