Delphi 如何在捕获CTRL+;s
在我的应用程序中,当我按下CTRL+S键时,我的表单(启用了键预览)将捕获此内容并保存文档。但是,当焦点位于例如编辑控件中时,我会听到恼人的“叮当”声,或者通常是windows声音。如何避免这种声音 这是我的表单对这一关键事件的捕获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
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()
,但正如Rob Kennedy指出的那样,GetAsyncKeyState()
李>GetKeyState()是一个更好的选择)
- 改用动作。在表单上弹出一个
,双击它,添加一个操作并将其热键设置为CTRL-s。将保存代码添加到它的TActionList
事件处理程序中。我相信这是做这件事的“正确”方式OneExecute
- 改用动作。在表单上弹出一个
希望这能有所帮助。但这不仅仅适用于这种情况,它将被禁用,直到它被启用。+1作为良好的替代参考,但有丑陋的副作用。@Jerrydoge…是丑陋的副作用;)事实证明,我从来没有花时间去查看行动列表,这正是我捕捉快捷方式(和许多其他东西)所需要的。我基本上知道它的功能,但从未使用过。。。到目前为止。是的,始终对所有用户索引事件使用操作使用GetKeyState,而不是GetAsyncKeyState。后者告诉您当前键的状态,而前者告诉您当前键盘消息生成时键的状态。在繁忙的系统上,这两个时间可能会有很大的不同。。。我记不起在给定的情况下哪一个是最好的…@Jerry Dodge:那就高兴吧!;)