CefSharp 79.1.360(Winform):如何在LifeSpanHandler中重新激活弹出窗口

问题描述 投票:0回答:1

使用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
    }


}

}

c# cefsharp
1个回答
0
投票

谢谢,我能够按照他的建议实现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);
                 }
             }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.