Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在捕获CTRL+;s_Delphi_Keyboard Shortcuts_Delphi 7_Audio - Fatal编程技术网

Delphi 如何在捕获CTRL+;s

Delphi 如何在捕获CTRL+;s,delphi,keyboard-shortcuts,delphi-7,audio,Delphi,Keyboard Shortcuts,Delphi 7,Audio,在我的应用程序中,当我按下CTRL+S键时,我的表单(启用了键预览)将捕获此内容并保存文档。但是,当焦点位于例如编辑控件中时,我会听到恼人的“叮当”声,或者通常是windows声音。如何避免这种声音 这是我的表单对这一关键事件的捕获 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var C: String; begin if not fChanging then

在我的应用程序中,当我按下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-是否有更标准的方式捕获这些事件?因为我确信我做错了什么,而且我确信还有另一种方法可以让这些关键事件不带声音。

这里有一些Delphi代码。

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

以下几点:

  • 尝试将代码放入
    FormKeyPress
    而不是
    FormKeyDown
    。这将使
    键:=0代码工作。。。不过,您需要通过使用类似于
    GetKeyState()
    (我最初在这里使用
    GetAsyncKeyState()
    ,但正如Rob Kennedy指出的那样,
    GetKeyState()是一个更好的选择)
  • 改用动作。在表单上弹出一个
    TActionList
    ,双击它,添加一个操作并将其热键设置为CTRL-s。将保存代码添加到它的
    OneExecute
    事件处理程序中。我相信这是做这件事的“正确”方式

希望这能有所帮助。

但这不仅仅适用于这种情况,它将被禁用,直到它被启用。+1作为良好的替代参考,但有丑陋的副作用。@Jerrydoge…是丑陋的副作用;)事实证明,我从来没有花时间去查看行动列表,这正是我捕捉快捷方式(和许多其他东西)所需要的。我基本上知道它的功能,但从未使用过。。。到目前为止。是的,始终对所有用户索引事件使用操作使用GetKeyState,而不是GetAsyncKeyState。后者告诉您当前键的状态,而前者告诉您当前键盘消息生成时键的状态。在繁忙的系统上,这两个时间可能会有很大的不同。。。我记不起在给定的情况下哪一个是最好的…@Jerry Dodge:那就高兴吧!;)