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

时间:2011-12-21 05:53:51

标签: delphi keyboard-shortcuts delphi-7 audio

在我的应用程序中,当我按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;

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

3 个答案:

答案 0 :(得分:7)

有几件事:

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

希望这有帮助。

答案 1 :(得分:2)

以下是disable the system beep的一些Delphi代码。

答案 2 :(得分:2)

为什么不使用动作?这是处理快捷方式的最佳方式。