【问题标题】:Adding a shortcut to a programmatically added system menu option向以编程方式添加的系统菜单选项添加快捷方式
【发布时间】:2012-09-30 06:52:43
【问题描述】:

在我的应用程序中,我有一个基本表单,其中将各种项目添加到系统菜单中,例如

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

如何为这些菜单选项添加键盘快捷键(例如 Alt-F2、Alt-F3)?

我不能使用使用加速器的标准方法(即 Alt-S 的 &Sticky),因为真正的菜单标题是希伯来语,而且加速器似乎无法在这种语言下正常工作。

【问题讨论】:

  • 查看 TMenuItem.Shortcut 或 TMenuItem.SetShortcut 下的代码。它可能有你需要的东西(我自己做不到,因为我手头没有Delphi)
  • 您正在寻找 InsertMenuItem
  • @DavidHeffernan:InsertMenuItem 的第四个参数是指向 MENUITEMINFO 结构的指针,该结构包含有关新菜单项的信息。但是这个结构不包含(据我所知)任何关于快捷方式的信息。
  • 你是对的。我记错了。对不起。
  • 呃。看起来很老派。必须使用 #9 分隔符将快捷方式文本添加到标题中。然后以基于消息的方式处理快捷方式调用。不平凡。

标签: delphi keyboard-shortcuts delphi-7


【解决方案1】:

这是一个使用 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;

【讨论】:

  • 太棒了!尽管我整个早上都在谷歌搜索并检查我的 Delphi(和 Windows)书籍,但我以前从未见过加速器表。这是最好的 - 每个人都可以学到一些东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多