【发布时间】:2020-07-23 15:32:31
【问题描述】:
当使用 LifSpanHandler 界面在 Cefsharp 主浏览器中单击链接时,我已经能够处理弹出窗口。但是,如果单击不同的弹出链接,则不会在 LifSpanHandler 接口中触发 OnBeforePopup 或 OnAfterCreated 等事件。如果我关闭弹出窗口,它会起作用。当弹出窗口已经存在时,是否有一个事件可以用来检测新链接何时加载到弹出窗口中?我在任何一个事件中都设置了一个断点,但如果弹出窗口存在,则两者都不会触发。
我的最终目标是根据点击的链接在弹出窗口中加载不同的窗口图标。
这是我的 LifeSpanHandler 接口类:
using CefSharp;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
namespace LifeSpanHandlerExample
{
internal class LifeSpanHandler : ILifeSpanHandler
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetWindowText(IntPtr hwnd, String lpString);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hwnd, int message, int wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WM_SETICON = 0x80;
private const int ICON_SMALL = 0;
private const int ICON_BIG = 1;
public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
//
return false;
}
public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
if (!browser.IsDisposed && browser.IsPopup)
{
System.IntPtr _handle = browser.GetHost().GetWindowHandle();
Bitmap bm = new Bitmap(Inc3DAppHelper.Properties.Resources.Incodema3D);
Icon icon = Icon.FromHandle(bm.GetHicon());
SendMessage(_handle, WM_SETICON, ICON_BIG, icon.Handle);
}
}
public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
//
}
public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
//Default Behavior
newBrowser = null;
return false; //return true to cancel popup creation
}
}
}
【问题讨论】:
-
如果弹出窗口已经打开,您看到的行为是预期的。您可以实现其他接口,如cefsharp.github.io/api/79.1.x/html/T_CefSharp_ILoadHandler.htm 或cefsharp.github.io/api/79.1.x/html/… 这些方法将在主浏览器和弹出窗口中调用,如果您只对弹出窗口感兴趣,则使用cefsharp.github.io/api/79.1.x/html/… 过滤掉主浏览器
-
优秀。感谢您指出正确的方向。我将尝试使用 Popup 过滤来尝试 ILoadHandler。