在 Delphi 应用程序中添加热键

yruzcnhs  于 2022-12-18  发布在  其他
关注(0)|答案(3)|浏览(127)

假设我有一个窗体,上面有一个菜单栏,菜单栏上有一个项目TMenuItem,我可以为它分配一个快捷组合键,例如Ctrl+I。但是当我为TMenuItem分配ShortCut属性时,它似乎只是改变菜单项的视觉外观以显示快捷方式代码,而不是自动侦听短-按下剪切键并触发我的ActionManager代码。
我的google-fu今天似乎失败了,我只找到了关于如何为windows分配全局热键的文章,而不是如何分配只在活动窗体上工作的应用程序特定热键。
除了在菜单中添加快捷键属性之外,谁能给我介绍一下添加热键的必要步骤?我在想,我可能需要在某个地方设置窗体监听键盘输入,捕获按键并响应它?但我不确定 Delphi 会在哪里或用什么方法来做。

4si2a6ki

4si2a6ki1#

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

bihw5rsg

bihw5rsg2#

考虑没有为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;
um6iljoc

um6iljoc3#

很高兴知道WM_HOTKEY的这种方式,但它太极端了:

  • 它在系统级别起作用,因此如果另一个应用程序处于活动状态,并且您在该应用程序上按下热键,它也会被我们的应用程序捕获。
  • 只有当我们的应用程序以键盘为焦点时,它才起作用

好的一面是它可以使用热键,如“控制”和“+”(VK_ADD = 107)和“控制”和“-”(VK_SUBTRACT = 109)。
购买我想要的是热键只有当我们的应用程序是活跃的,不影响任何其他应用程序的热键。
谢谢,至少我有了个起点。

相关问题