如何重写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
相关产品推荐
相关产品推荐

