0

在 Windows 10 上的 32 位 Delphi 11 VCL 应用程序中,当右键单击任何菜单项时,我需要获取单击的 MenuItem 的名称。

TApplicationEvents当我单击任何菜单项时,我使用一个组件和此代码来获得通知:

procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.message of
    Winapi.Messages.WM_COMMAND:
      begin
        CodeSite.Send('TformMain.ApplicationEvents1Message: WM_COMMAND');
      end;
  end;
end;

然而:

  1. 如何仅在右键单击菜单项时获得通知?

  2. 如何获取单击的 MenuItem 的名称?

4

2 回答 2

2

每个TMenu(即TMainMenuTPopupMenu)都提供了一个方法FindItem,它允许您通过不同的标准找到一个项目。在您的情况下,对表单主菜单的正确调用是

TheMenuItem := Menu.FindItem(Msg.wParam, fkCommand);
于 2021-11-19T10:18:18.733 回答
0

由于我的应用程序中有几个表单,并且每个表单上有几个(弹出)菜单,因此这里需要一个特殊的解决方案:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.message of
      Winapi.Messages.WM_COMMAND:
      begin
        // Todo: Check HERE for RightMouseButtonDown - BUT HOW? (Or how to check HERE for modifier keys?)

        var ThisMenuItem := GetMenuItem(Msg.wParam);
        if Assigned(ThisMenuItem) then
        begin
          CodeSite.Send('TForm1.ApplicationEvents1Message: Clicked MenuItem Name', ThisMenuItem.Name);
        end;

      end;
  end;
end;

function TForm1.GetMenuItem(const aWParam: NativeUInt): TMenuItem;
var
  ThisMenuItem: TMenuItem;
begin
  Result := nil;
  var ThisForm := Screen.ActiveForm; // works on any form in the application
  for var i := 0 to ThisForm.ComponentCount - 1 do
  begin
    if ThisForm.Components[i] is TMenu then
    begin
      ThisMenuItem := TMenu(ThisForm.Components[i]).FindItem(aWParam, fkCommand);
      if Assigned(ThisMenuItem) then
      begin
        Result := ThisMenuItem;
        EXIT;
      end;
    end;
  end;
end;
于 2021-11-20T14:35:47.447 回答