Перенаправление почты на ссылку с помощью CefSharp C # - PullRequest
1 голос
/ 09 ноября 2019

У меня есть простое приложение на C #, использующее браузер cefSharp chromium, с которого я загружаю веб-страницу. Проблема в том, что ссылка mailto не перенаправляет на почтовый клиент по умолчанию. Я читал, и кажется, что мне нужно добавить обработчик. Документация говорит, чтобы использовать OnBeforeResourceLoad. Я пытался всеми способами, которые я могу думать, но не могу заставить его работать. Я надеялся, что кто-нибудь может добавить к имеющемуся у меня коду код, который будет включать класс (в правильном месте и все остальное, чтобы заставить его работать. Вот ссылка, по которой я пытался использовать информацию, но не знаю,как это реализовать.

Как открыть ссылку в родном браузере из CefSharp 3

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;    

namespace WindowsFormsApp4
{    
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            InitBrowser();            
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            browser = new ChromiumWebBrowser("https://google.com");

            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
        }        
    }
}

Вот один из способов, которые я пытался, но не смогприступить к работе.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;


namespace WindowsFormsApp4
{
    public class BrowserRequestHandler : IRequestHandler
    {
        public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
        {
            // Open in Default browser
            if (!request.Url.StartsWith("mailto:"))
            {
                System.Diagnostics.Process.Start(request.Url);
                return true;
            }
            return false;
        }
    }
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            InitBrowser();            
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            browser = new ChromiumWebBrowser("https://google.com");
            browser.RequestHandler = new BrowserRequestHandler();
            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
        }        
    }
}

Я добавил

using CefSharp.Handler;

, и теперь я не получаю сообщение об ошибке, но даже не появляется окно сообщения. Вот что у меня есть:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

using CefSharp.Handler;

namespace CefSharp
{

}

namespace WindowsFormsApp4
{
    public class CustomResourceRequestHandler : ResourceRequestHandler
    {
        public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
        {
            System.Windows.Forms.MessageBox.Show("Test");
            // Open in Default browser
            if (!request.Url.StartsWith("mailto:"))
            {
                System.Diagnostics.Process.Start(request.Url);
                return true;
            }
            return false;
        }

    }

    public class CustomRequestHandler : RequestHandler
    {
        protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
        {
            return new CustomResourceRequestHandler();
        }
    }

    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            InitBrowser();            
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            browser = new ChromiumWebBrowser("https://google.com");
            browser.RequestHandler = new CustomRequestHandler();
            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
        }        
    }
}

Я заставил это работать, но я хотел бы, чтобы вы внесли свой вклад, если я делаю это правильно.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using CefSharp.Handler;



namespace WindowsFormsApp4
{
    public class CustomResourceRequestHandler : ResourceRequestHandler
    {


        protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
        {
            if (request.Url.StartsWith("mailto:"))
            {
                System.Diagnostics.Process.Start(request.Url);
                return CefReturnValue.Cancel;
            }
            return CefReturnValue.Continue;
        }

    }

    public class CustomRequestHandler : RequestHandler
    {
        protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
        {
            return new CustomResourceRequestHandler();
        }
    }

    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            InitBrowser();            
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            browser = new ChromiumWebBrowser("http://www.google.com");
            browser.RequestHandler = new CustomRequestHandler();
            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
        }        
    }
}
...