7

假设我有一个表格,上面有一个菜单栏。我在菜单栏上有一个项目 a TMenuItem,我可以为其分配一个快捷键组合,例如Ctrl+ I。但是,当我为 分配ShortCut属性时TMenuItem,它似乎只是更改了菜单项的视觉外观以显示快捷键代码,而不是自动侦听要按下的快捷键并触发我的 ActionManager 代码。

我的 google-fu 今天似乎失败了,我只找到有关如何为 Windows 分配全局热键的文章,而不是如何分配仅适用于活动表单的特定于应用程序的热键。

任何人都可以为我概述添加热键所需的步骤,而不仅仅是在菜单中添加快捷方式属性。我在想某个地方我可能需要将表单设置为监听键盘输入并捕获按键并响应它?但我不完全确定 Delphi 会在哪里或以什么方式做到这一点。

4

2 回答 2

8

您似乎正在使用 Actions (ActionManager),因此请将您的快捷方式分配给相关的 Action。(将 Action 分配给 MenuItem 也会将快捷方式分配给菜单项。)

于 2012-07-24T07:23:14.147 回答
4

考虑没有为 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;
于 2012-07-24T17:13:01.227 回答