捕获CTRL + S时如何摆脱窗口声音?

Jer*_*dge 2 delphi audio keyboard-shortcuts delphi-7

在我的应用程序中,当我按下时CTRL + S,我的表单(启用了键预览)捕获并保存文档.但是当焦点在例如编辑控件中时,我会听到令人讨厌的"丁"声,或者通常是窗口声.我该如何避免这种声音?

这是我的表格捕获这个关键事件......

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  C: String;
begin
  if not fChanging then
    Modified;
  if ssCtrl in Shift then begin
    C:= LowerCase(Char(Key));
    if C = 's' then begin
      DoSave;
      Key:= 0; //Tried this but didn't work
    end else
    if C = 'c' then begin
      //Copy selected item(s)
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

PS - 是否有更标准的方法来捕获这些事件?因为我确定我做错了什么,而且我确信我还有另一种方法可以在没有声音的情况下获得这些关键事件.

Nat*_*Nat 7

有几件事:

  • 尝试将代码放入FormKeyPress而不是FormKeyDown.这将使Key := 0;代码工作......你需要手动处理CTRL检查,通过使用类似的东西GetKeyState()(我原来在GetAsyncKeyState()这里,但正如Rob Kennedy指出的那样,GetKeyState() is a much better option).
  • 请改用Action.扑通一声一个TActionList表单,就可以双击,添加一个动作,并设置它的热键为Ctrl-S.将保存代码添加到其OnExecute事件处理程序中.我相信这是"正确"的方式.

希望这可以帮助.

  • 使用GetKeyState,而不是GetAsyncKeyState.后者告诉你当前键*的状态*,而前者告诉你当前键盘消息*生成*时键的状态.在繁忙的系统上,这两次可能会有很大不同. (5认同)