【问题标题】:Adding a hot-key to my Delphi app向我的 Delphi 应用程序添加热键
【发布时间】:2012-07-24 05:39:27
【问题描述】:

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

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

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

【问题讨论】:

  • 通常情况下,随心所欲地做是没有问题的。它只是自动工作。由于您使用的是操作管理器,因此您应该使用TActionShortCut 属性,而不是TMenuItem
  • 是的,只需分配 ShortCut 属性就可以了。
  • 将菜单项视为“一种动态构建的方式来呈现我的静态定义的操作”,因此,我设置了我的操作,而不是我的菜单项属性。菜单项属性源自操作列表或操作管理器,并向外传播。
  • @AndreasRejbrand 是的,通过操作管理器工作,谢谢 =) ...但是有一种方法可以让自己的用户定义快捷方式想要什么,比如自定义快捷方式?

标签: delphi delphi-7


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    考虑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;
    

    【讨论】:

    • -1 问题明确指出系统范围的热键不是必需的
    • 无论如何,它是一个有用的解决方案,展示了如何设置全局热键
    • 完美,正是我需要的!
    猜你喜欢
    • 2011-04-17
    • 2012-03-13
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多