2012-07-24 27 views
5

假设我有一个表单,上面有一个菜单栏。我在菜单栏上有一个项目,一个TMenuItem,我可以为其分配一个快捷键组合,例如“Ctrl-I”。但是,当我为TMenuItem分配“ShortCut”属性时,它似乎只是改变菜单项的视觉外观以显示快捷方式代码,而不是自动侦听要按下的快捷键并触发我的ActionManager代码。在我的德尔福应用程序中添加一个热键

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

任何人都可以为我概述除了在菜单中添加快捷方式属性之外添加热键的必要步骤。我想在某处我可能需要设置表单来监听键盘输入并捕获按键并响应它?但我不确定德尔福的方式在哪里或什么。

+4

通常情况下,是在做你希望的东西没有问题。它只是自动工作。由于您正在使用动作管理器,因此您应该使用'TAction'的'ShortCut'属性,而不是'TMenuItem'。 – 2012-07-24 06:06:56

+0

是的,只需分配ShortCut属性即可。 – 2012-07-24 07:42:34

+0

将菜单项视为“呈现静态定义的动作的一种动态构建方式”,因此,我设置了我的操作,而不是我的菜单项属性。菜单项属性来自动作列表或动作管理器,并向外传播。 – 2012-07-24 13:32:04

回答

6

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

+0

这工作,谢谢! – 2012-07-24 17:59:17

-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; 
+1

-1问题明确指出,无论如何,系统范围内的热键并不是 – 2012-07-24 17:26:43

+0

所要求的,它是一个有用的解决方案,它显示了如何设置全局热键 – jimsweb 2016-02-21 23:33:18