CefSharp 79.1.360 (Winform): как активировать всплывающее окно в LifeSpanHandler - PullRequest
0 голосов
/ 10 апреля 2020

Мне удалось обработать всплывающее окно при нажатии ссылки в главном браузере Cefsharp с использованием интерфейса LifSpanHandler. Однако если щелкнуть другую всплывающую ссылку, ни одно из событий, таких как OnBeforePopup или OnAfterCreated, не запускается в интерфейсе LifSpanHandler. Это работает, если я закрываю всплывающее окно. Есть ли событие, которое я могу использовать, чтобы определить, когда новая ссылка загружается во всплывающее окно, когда всплывающее окно уже там? Я устанавливаю точку останова в любом из этих событий, но ни одно из них не срабатывает, если есть всплывающее окно.

Моя конечная цель - загрузить другой значок окна во всплывающее окно в зависимости от ссылки, по которой щелкают.

Это мой класс интерфейса 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
    }


}

}

1 Ответ

0 голосов
/ 11 апреля 2020

Спасибо 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);
                 }
             }
        }
    }
}
...