使用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
}
}
}
谢谢,我能够按照他的建议实现ILoadHandler。这非常酷,因为它还解决了弹出窗口(如果已打开)无法弹出到前面的问题。现在,我也可以通过知道URL链接来更改图标,但稍后再进行处理。对于尝试解决同一问题的其他人,这是LoadHandler接口类的代码,用于将弹出窗口置于最前面。
using CefSharp;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
namespace CefSharpExample
{
internal class LoadHandler : ILoadHandler
{
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public void OnFrameLoadEnd(IWebBrowser chromiumWebBrowser, FrameLoadEndEventArgs frameLoadEndArgs)
{
//
}
public void OnFrameLoadStart(IWebBrowser chromiumWebBrowser, FrameLoadStartEventArgs frameLoadStartArgs)
{
//
}
public void OnLoadError(IWebBrowser chromiumWebBrowser, LoadErrorEventArgs loadErrorArgs)
{
//
}
public void OnLoadingStateChange(IWebBrowser chromiumWebBrowser, LoadingStateChangedEventArgs loadingStateChangedArgs)
{
if (loadingStateChangedArgs.Browser.IsPopup)
{
System.IntPtr _handle = loadingStateChangedArgs.Browser.GetHost().GetWindowHandle();
{
SetFocus(_handle);
SetForegroundWindow(_handle);
}
}
}
}
}