【问题标题】:CefSharp 79.1.360 (Winform): How to reactivate popup in LifeSpanHandlerCefSharp 79.1.360 (Winform):如何在 LifeSpanHandler 中重新激活弹出窗口
【发布时间】: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
    }


}

}

【问题讨论】:

标签: c# cefsharp


【解决方案1】:

感谢 amaitland,我能够按照他的建议实现 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);
                 }
             }
        }
    }
}

【讨论】:

  • 您可能只想在cefsharp.github.io/api/79.1.x/html/… 为真或为假时设置焦点,具体取决于您的要求。就目前而言,您将在页面开始加载时设置焦点,然后在完成时再次设置。
猜你喜欢
  • 2016-10-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多