2012-09-30 31 views
7

En mi solicitud, tienen una forma de base en el que varios elementos se agregan al menú del sistema, por ejemploAdición de un acceso directo a una opción de menú del sistema agregado mediante programación

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

¿Cómo se puede añadir atajos de teclado para estos opciones de menú (ej. Alt-F2, Alt-F3)?

No puedo usar el método estándar de usar un acelerador (es decir, & Adhesivo para Alt-S) ya que los títulos del menú real están en hebreo y parece que los aceleradores no funcionan correctamente con este idioma.

+0

Comprobar el código bajo TMenuItem.Shortcut o TMenuItem.SetShortcut. Probablemente tenga lo que necesita (no puedo hacerlo yo solo porque no tengo Delphi a la mano) –

+0

Está buscando InsertMenuItem –

+0

@DavidHeffernan: El cuarto parámetro para InsertMenuItem es un puntero a una estructura de MENUITEMINFO que contiene información sobre el nuevo menú ít. Pero esta estructura no contiene (por lo que puedo ver) ninguna información sobre atajos. –

Respuesta

6

He aquí un ejemplo que utiliza un 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

¡Fantástico! A pesar de que he estado buscando en Google toda la mañana y revisando mis libros de Delphi (y Windows), nunca antes había visto una mesa de aceleración. Esto es TAN en su mejor momento - ¡todos pueden aprender algo! –

Cuestiones relacionadas