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

如何重写TEdgeBrowser组件的Context Menu上下文菜单

TEdgeBrowser自定义上下文菜单实现方案

TEdgeBrowser组件原生未在属性检查器中暴露上下文菜单相关事件,其底层基于Edge Chromium内核,需要通过内核提供的扩展接口实现需求,以下是两种可行实现方案:

方案1:通过ICoreWebView2接口接管上下文菜单事件(推荐,支持获取点击上下文)

该方案可以拿到右键点击位置的网页元素信息(如是否点击了链接、图片、选中的文本内容),适合需要动态生成菜单的复杂场景:

  • 首先需要在uses中引入Winapi.WebView2、Vcl.Edge单元
  • 响应TEdgeBrowser的OnCreateWebViewCompleted事件,在WebView初始化完成后注册上下文菜单监听事件,示例代码如下:
procedure TForm1.EdgeBrowser1CreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HResult);
var
  WebView2: ICoreWebView2;
  EventToken: EventRegistrationToken;
begin
  if Succeeded(AResult) then
  begin
    WebView2 := Sender.DefaultInterface as ICoreWebView2;
    // 注册上下文菜单请求事件
    WebView2.add_ContextMenuRequested(
      TCallback<ICoreWebView2ContextMenuRequestedEventHandler>.Create(
        procedure(const sender: ICoreWebView2; const args: ICoreWebView2ContextMenuRequestedEventArgs)
        begin
          // 屏蔽默认弹出菜单
          args.SuppressDefaultMenu := True;
          // 可通过args对象获取点击上下文信息,自定义菜单逻辑
          // 弹出自己实现的TPopupMenu
          PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
        end), @EventToken);
  end;
end;

方案2:轻量实现(仅需固定自定义菜单可选用)

如果不需要感知网页点击上下文,仅需要替换成固定的自定义菜单,可以用更简单的实现方式:

  • WebView初始化完成后注入JS禁用网页默认右键事件:
    EdgeBrowser1.ExecuteScript('document.addEventListener("contextmenu", e => e.preventDefault());');
  • 响应TEdgeBrowser的OnMouseDown事件,右键点击时弹出自定义菜单即可:
procedure TForm1.EdgeBrowser1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Pt: TPoint;
begin
  if Button = mbRight then
  begin
    Pt := EdgeBrowser1.ClientToScreen(Point(X, Y));
    PopupMenu1.Popup(Pt.X, Pt.Y);
  end;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:45:03