说我有一个表单,上面有一个菜单栏。我在菜单栏上有一个项目TMenuItem
,我可以为其分配快捷键组合,例如 Ctrl + I 。但是,当我为ShortCut
分配TMenuItem
属性时,似乎只是更改菜单项的视觉外观以显示快捷键代码而不是自动侦听要按下的快捷键。触发我的ActionManager代码。
我的google-fu今天似乎失败了,我只找到有关如何为Windows分配全局热键的文章,而不是如何分配仅适用于活动表单的特定于应用程序的热键。 / p>
任何人都可以为我概述添加热键所需的步骤,而不仅仅是在菜单中添加快捷方式属性。我在想某个地方我可能需要将表单设置为监听键盘输入并捕获按键并对其进行响应?但我不确定Delphi的做法在哪里或者是什么。
答案 0 :(得分:8)
您似乎正在使用Actions(ActionManager),因此请将快捷方式指定给相关的Action。 (将动作分配给MenuItem也会将快捷方式分配给菜单项。)
答案 1 :(得分:1)
考虑没有为VCL消息提供窗口句柄的示例,我们使用 WM_HOTKEY 。此消息由Windows热键中的注册窗口发送,允许程序响应它,即使没有输入焦点:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
// Declare a event handler
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
// Registering a hotkey Ctrl+Alt+F5
RegisterHotKey(Handle, 0, MOD_CONTROL or MOD_ALT, VK_F5);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Unregisters a hotkey
UnRegisterHotKey(Handle, 0);
end;
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
// This procedure is called when a window message WM_HOTKEY
inherited; // We give the form to process the message,
// if she already has its handler
Beep; // We perform additional actions
end;