2012-07-24 45 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