2012-09-30 4 views
7

In meiner Anwendung habe ich eine Grundform haben, in dem verschiedene Elemente in das Systemmenü hinzugefügt, zum Beispieleine Verknüpfung zu einem Programm hinzugefügt Systemmenüoption Hinzufügen

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

Wie man Tastenkombinationen zu diesen hinzufügt Menüoptionen (zB Alt-F2, Alt-F3)?

Ich kann nicht die Standardmethode der Verwendung eines Beschleunigers verwenden (dh & Sticky für Alt-S), da die tatsächlichen Menübeschriftungen in Hebräisch sind und Beschleuniger scheinen nicht richtig mit dieser Sprache zu arbeiten.

+0

Überprüfen Sie den Code unter TMenuItem.Shortcut oder TMenuItem.SetShortcut. Es hat wahrscheinlich, was Sie brauchen (kann es nicht selbst tun, weil ich nicht Delphi zur Hand habe) –

+0

Sie suchen nach InsertMenuItem –

+0

@DavidHeffernan: Der vierte Parameter zu InsertMenuItem ist ein Zeiger auf eine Struktur MENUITEMINFO, die Informationen über das neue Menü enthält Artikel. Aber diese Struktur enthält (so weit ich das sehe) keine Informationen über Verknüpfungen. –

Antwort

6

Hier ist ein Beispiel, das eine accelerator table verwendet:

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

Fantastisch! Trotz der Tatsache, dass ich den ganzen Morgen gegoogelt habe und meine Delphi (und Windows) Bücher überprüft habe, habe ich noch nie einen Beschleunigertisch gesehen. Das ist SO von seiner besten Seite - jeder kann etwas lernen! –