如何在 VCL TMemo 控件的按键事件处理程序中检测 Ctrl+Alt+x?

How to detect Ctrl+Alt+x in the keypress event handler of a VCL TMemo control?

我已经创建了一个带有单个 TMemo 控件的 Delphi VCL 应用程序,这是我拥有的代码。 我用它来检测Ctrl+somekey。例如,当我按下 Ctrl+x 时,它会弹出警报 ctrlCtrl+x 的效果(切) 已取消。

function IsKeyDown(Key: Integer): Boolean;
begin
  Result := (GetAsyncKeyState(Key) and (1 shl 15) > 0);
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if IsKeyDown(VK_CONTROL) then
  begin
    ShowMessage('ctrl');
    Key := #0;
  end;

end;

然而,当我稍微改变一下时:

function IsKeyDown(Key: Integer): Boolean;
begin
  Result := (GetAsyncKeyState(Key) and (1 shl 15) > 0);
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if IsKeyDown(VK_CONTROL) and IsKeyDown(VK_MENU) then
  begin
    ShowMessage('ctrl+alt');
    Key := #0;
  end;

end;

它不再起作用了。我需要的是检测像 Ctrl+Alt+f 这样的组合。我知道我可以使用 TActionList,但我只想知道为什么我的代码不起作用。

您应该改用 OnKeyDown,它为您提供键值和修饰键。我已经在下面的代码中演示了如何捕获一个修改键和多个修改键。

uses
  { Needed for virtual key codes in recent Delphi versions. }
  System.UITypes;  
                 

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState);
begin
  if (Key = vkX) and ([ssCtrl] = Shift) then
  begin
    Key := 0;
    ShowMessage('Got Ctrl+X');
  end
  else if (Key = vkZ) and ([ssCtrl, ssAlt] = Shift) then
  begin
    Key := 0;
    ShowMessage('Got Ctrl+Alt+Z');
  end;
end;