2012-09-30 49 views
7

在我的應用程序,我在其中的各種項目添加到系統菜單鹼基形式,例如添加快捷方式以編程方式添加系統菜單選項

AppendMenu (SysMenu, MF_SEPARATOR, 0, ''); 
AppendMenu (SysMenu, MF_STRING, SC_Sticky, 'Sticky'); 
AppendMenu (SysMenu, MF_STRING, SC_Original, 'Original'); 

一個人如何添加鍵盤快捷鍵,這些菜單選項(例如Alt-F2,Alt-F3)?

我不能使用使用加速器的標準方法(即& Sticky for Alt-S),因爲真正的菜單標題是用希伯來語表示的,加速器似乎無法正確使用該語言。

+0

檢查TMenuItem.Shortcut或TMenuItem.SetShortcut下的代碼。它可能有你需要的東西(不能自己做,因爲我手頭沒有Delphi) –

+0

您在找InsertMenuItem –

+0

@DavidHeffernan:InsertMenuItem的第四個參數是一個指向MENUITEMINFO結構的指針,它包含有關新菜單的信息項目。但是這個結構並不包含(就我所見)關於快捷方式的任何信息。 –

回答

6

下面是一個使用一個accelerator table一個例子:

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, AppEvnts; 

type 
    TForm1 = class(TForm) 
    ApplicationEvents1: TApplicationEvents; 
    procedure FormCreate(Sender: TObject); 
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); 
    procedure FormDestroy(Sender: TObject); 
    private 
    FAccelTable: HACCEL; 
    FAccels: array[0..1] of TAccel; 
    protected 
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

const 
    SC_Sticky = 170; 
    SC_Original = 180; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    SysMenu: HMENU; 
begin 
SysMenu := GetSystemMenu(Handle, False); 
AppendMenu (SysMenu, MF_SEPARATOR, 0, ''); 
AppendMenu (SysMenu, MF_STRING, SC_Sticky, 'Sticky'#9'Alt+F2'); 
AppendMenu (SysMenu, MF_STRING, SC_Original, 'Original'#9'Alt+F3'); 

FAccels[0].fVirt := FALT or FVIRTKEY; 
FAccels[0].key := VK_F2; 
FAccels[0].cmd := SC_Sticky; 
FAccels[1].fVirt := FALT or FVIRTKEY; 
FAccels[1].key := VK_F3; 
FAccels[1].cmd := SC_Original; 

FAccelTable := CreateAcceleratorTable(FAccels, 2); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    DestroyAcceleratorTable(FAccelTable); 
end; 

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; 
    var Handled: Boolean); 
begin 
    TranslateAccelerator(Handle, FAccelTable, Msg); 
    inherited; 
end; 

procedure TForm1.WMSysCommand(var Message: TWMSysCommand); 
begin 
    inherited; 
    case Message.CmdType of 
    SC_Sticky: ShowMessage('sticky'); 
    SC_Original: ShowMessage('original'); 
    end; 
end; 
+0

太棒了!儘管我一直在使用googling並檢查我的Delphi(和Windows)書籍,但我從未見過加速器表。這是最好的 - 每個人都可以學到一些東西! –