【问题标题】:How to get rid of windows sounds when capturing CTRL + S?捕获CTRL + S时如何摆脱Windows声音?
【发布时间】:2011-12-21 05:53:50
【问题描述】:

在我的应用程序中,当我按下CTRL + S 时,我的表单(启用键预览)会捕获并保存文档。但是,例如,当焦点位于编辑控件时,我会听到烦人的“叮”声,或者通常是 windows 声音。如何避免这种声音?

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

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 - 有没有更标准的方法来捕捉这些事件?因为我确信我做错了什么,而且我确信还有另一种方法可以让我在没有声音的情况下获取这些关键事件。

【问题讨论】:

  • 事实证明,我从来没有花时间查看操作列表,而这正是我捕获快捷方式(以及许多其他事情)所需要的。我基本上知道它的作用,但从未使用过它......直到现在。
  • 是的,始终对所有用户 inoked 事件使用操作

标签: delphi keyboard-shortcuts delphi-7 audio


【解决方案1】:

有几点:

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

希望这会有所帮助。

【讨论】:

  • 使用 GetKeyState,而不是 GetAsyncKeyState。后者告诉您现在键的状态,而前者告诉您当前键盘消息生成时的键状态。在繁忙的系统上,这两个时间可能会有很大差异。
  • 好点...我不记得在给定情况下哪个是最好的...
【解决方案2】:

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

【讨论】:

  • @Jerry Dodge:那就开心吧! ;)
【解决方案3】:

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

【讨论】:

  • 但是它不仅仅适用于这种情况,它会在重新启用之前被禁用。
  • +1 是很好的替代参考,但副作用很丑。
  • @JerryDodge...是的丑陋的副作用;)
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
相关资源
最近更新 更多