Adding a shortcut to a software-added system menu

In my application, I have a basic form in which various elements are added to the system menu, for example

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

How to add keyboard shortcuts to these menu options (e.g. Alt-F2, Alt-F3)?

I can’t use the standard accelerator method (i.e. & Sticky for Alt-S), since real Hebrew menu labels and accelerators do not seem to work properly with this language.

+7
source share
1 answer

Here is an example that uses the 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; 
+6
source

All Articles