雖然能用CefSharp將web應用嵌入到窗體程序,但遇到<a >標簽(_blank)會彈出一個窗口,而且在任意位置可以彈出右鍵菜單,需要解決這個問題才像一個真正的客戶端軟件。
不彈子窗體
控制彈窗的接口是ILifeSpanHandler,並實現OnBeforePopup方法。如下:
定義LifeSpanHandler類:
using CefSharp; using CefSharp.WinForms; namespace CefTest { internal class LifeSpanHandler : ILifeSpanHandler { //彈出前觸發的事件 public bool OnBeforePopup(IWebBrowser webBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { //使用源窗口打開鏈接,取消創建新窗口 newBrowser = null; var chromiumWebBrowser = (ChromiumWebBrowser)webBrowser; chromiumWebBrowser.Load(targetUrl); return true; } public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser) { } public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser) { return true; } public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser) { } } }
調用方式:
ChromeBrowser.LifeSpanHandler = new LifeSpanHandler();
禁用右鍵
禁用右鍵的接口是IContextMenuHandler,並實現OnBeforeContextMenu 方法。如下:
定義MenuHandler類:
using CefSharp; namespace CefTest { internal class MenuHandler : IContextMenuHandler { public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model) { model.Clear(); } public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags) { return false; } public void OnContextMenuDismissed(IWebBrowser webBrowser, IBrowser browser, IFrame frame) { } public bool RunContextMenu(IWebBrowser webBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback) { return false; } } }
調用方式:
ChromeBrowser.MenuHandler = new MenuHandler();