在我的Delphi应用程序中添加热键

Jes*_*own 7 delphi delphi-7

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

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

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

Ond*_*lle 8

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


小智 5

考虑没有为 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;
Run Code Online (Sandbox Code Playgroud)

  • -1 问题明确指出系统范围的热键不是所需要的 (2认同)
  • 无论如何,它是一个有用的解决方案,展示了如何设置全局热键 (2认同)