You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WM_MENURBUTTONUP检测TMenuItem的右键点击事件

问题根因

VCL对菜单类消息做了内部封装,WM_MENURBUTTONUP属于菜单模态循环内的消息,不会进入TApplicationEvents的OnMessage事件分发队列,因此你用ApplicationEvents无法捕获该消息。

实现方案

方案1:直接在Form层绑定消息映射(最简单,适合单个PopupMenu场景)

  1. 在Form的类定义中添加WM_MENURBUTTONUP消息的处理函数声明:
type
  TForm1 = class(TForm)
    // 你的原有组件、变量声明
  private
    procedure WMMenuRButtonUp(var Msg: TMessage); message WM_MENURBUTTONUP;
  public
    // 你的原有公开声明
  end;
  1. 实现消息处理函数:
procedure TForm1.WMMenuRButtonUp(var Msg: TMessage);
var
  TargetItem: TMenuItem;
  MenuHandle: HMENU;
  ItemPos: Integer;
begin
  inherited;
  MenuHandle := HMENU(Msg.LParam);
  ItemPos := Msg.WParam;
  // 匹配你要处理的PopupMenu的句柄
  if MenuHandle = PopupMenu1.Handle then
  begin
    TargetItem := PopupMenu1.Items[ItemPos];
    // 此处写入你的右键点击业务逻辑
    CodeSite.Send('右键点击菜单项:' + TargetItem.Caption);
    // 若需要阻止系统默认右键点击行为(关闭菜单),可设置 Msg.Result := 1
  end;
end;

方案2:继承TPopupMenu实现通用右键捕获(适合多个PopupMenu复用场景)

自定义封装支持右键事件的PopupMenu类,可全局复用:

type
  TMenuRightClickEvent = procedure(Sender: TObject; ClickItem: TMenuItem) of object;

  TRightAwarePopupMenu = class(TPopupMenu)
  private
    FOnMenuItemRightClick: TMenuRightClickEvent;
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    property OnMenuItemRightClick: TMenuRightClickEvent read FOnMenuItemRightClick write FOnMenuItemRightClick;
  end;

procedure TRightAwarePopupMenu.WndProc(var Message: TMessage);
var
  ClickItem: TMenuItem;
begin
  inherited;
  if Message.Msg = WM_MENURBUTTONUP then
  begin
    ClickItem := Items[Message.WParam];
    if Assigned(FOnMenuItemRightClick) then
      FOnMenuItemRightClick(Self, ClickItem);
  end;
end;

使用时直接实例化TRightAwarePopupMenu,绑定OnMenuItemRightClick事件即可收到菜单项的右键点击通知。

注意事项

如果你的PopupMenu包含嵌套子菜单,需要额外判断消息携带的菜单句柄是否为子菜单句柄,递归查找对应的MenuItem即可。

内容的提问来源于stack exchange,提问作者user1580348

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:15:04