我已经在我的 WinForms 中嵌入了 CefSharp。现在我正在尝试找到一种机制,以某种方式让用户使用开发工具的元素选择器(不显示内置开发工具窗口)并在用户单击元素时,我想在我的 .NET 代码中获取 HTML。
我可以这样做吗?有什么帮助吗?
谢谢,
汗
我已经在我的 WinForms 中嵌入了 CefSharp。现在我正在尝试找到一种机制,以某种方式让用户使用开发工具的元素选择器(不显示内置开发工具窗口)并在用户单击元素时,我想在我的 .NET 代码中获取 HTML。
我可以这样做吗?有什么帮助吗?
谢谢,
汗
希望我能正确理解您的要求;“您想让用户看到当前悬停元素的突出显示,然后通过鼠标单击来选择它”?然后我会采取另一条路线,而不是挂钩到 Dev Tools 检查器功能。
我认为使用您自己的 JavaScript 片段复制它更容易,就像在另一个问题中一样:在鼠标悬停时突出显示 DOM 元素,就像 inspect 一样。甚至还有一个 JSFiddle 演示,其中一种建议的编码方式。
然后,您“仅”需要检测用户单击的元素并将其发送到 .NET 端。
有关在 .NET 和 JS(或相反)之间调用的帮助,请参阅CefSharp FAQ。
如果您出于某种原因想要采取的路线确实是使用 DevTools Inspector,我将开始查看:
这个老问题作为谷歌的最高结果出现了,找到一个好的解决方案并不容易,所以希望这可以帮助其他不得不搞乱cefsharp的人。您可以通过实现 IContextMenuHandler 添加“检查”上下文菜单选项。
public class DevToolsMenuHandler : IContextMenuHandler
{
public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
IMenuModel model)
{
model.AddItem(CefMenuCommand.CustomFirst, "Inspect");
}
public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
CefMenuCommand commandId, CefEventFlags eventFlags)
{
if (commandId != CefMenuCommand.CustomFirst) return false;
browser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);
return true;
}
public void OnContextMenuDismissed(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
{
}
public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
IMenuModel model, IRunContextMenuCallback callback)
{
return false;
}
}
然后将您的自定义菜单处理程序分配给您的 CEF 浏览器实例,如下所示:
CefBrowser.MenuHandler = new DevToolsMenuHandler();