У меня есть простое приложение на 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;
}
}
}