在Delphi中有一个控件THotKey,可以用来设置自定义的快捷键。
一般情况可以 ShortCutToText,以文件的形式将设置的快捷键保存下来,还可以用TextToShortCut,将保存成文本的键值灰复。
这种方式虽然很直观,但是存在一些问题,大键盘的“Ctrl+1” 与 数字键盘的“Ctrl+1”,在THotKey控件显示是不同的,前者会显示 “Ctrl + 1” ,而后者会显示 “Ctrl + Num 1”,但是用 ShortCutToText 输出均显示“Ctrl + 1”,如果是这样那么用TextToShortCut恢复键值就会出错。
对于这个问题,网上有人建议在保存键值的同时,将THotKey的Modifiers属值也保存下来,这也是一种办法。
实际还可以用另外方法来处理,首先,我们设置的快捷键是保存在Hotkey属性中的,它是TShortCut类形,实际上是word类形的。那么可以直接用IntToStr()来保存HotKey中的值。恢复时直接用:
HotKey1.HotKey:=StrToInt();
在FormKeyDown中响应快捷键
if ShortCut( Key , Shift) = HotKey1.HotKey then
begin
//处理代码
end;
对于单文档界面程序以上方法足可以应付了。但是对于多文档界面,不适用,当主窗体失去焦点后,就不会再响应快捷键了。对于多文档界面的程序可以用以下方来处理。
在FormCreate中
Application.OnShortCut :=MyShortCut;
MyShortCut的处理过程:
procedure TForm1.MyShortCut(var msg: TWMKey; var Handled: boolean);
var
aKey: TShortCut;
aShift : TShiftState;
begin
aShift:=KeyDataToShiftState(Msg.KeyData);
aKey:=ShortCut(Msg.CharCode, aShift);
//这里的akey即得到的快捷键 键值
。。。。//处理代码