我在C#中创建一个Web浏览器,并根据用户右键单击的元素显示自定义上下文菜单。我无法确定应将哪些元素视为链接?
if (el_tag == "a")
showLinkMenu();
else if (el_tag == "img" && parent_tag == "a")
showAdvancedMenu();
else if (el_tag == "img")
showImgMenu();
Shot1:Google chrome detected this as a link
Shot2:Structure a> div> div> div> div> IMG
如何检测此类链接?
答案 0 :(得分:1)
您应该迭代父标记列表,如果其中任何标记属于<a>
属性href
,则称其为链接。
答案 1 :(得分:0)
我建议您实施自己的IContextMenuHandler
并使用内置的CefMenuCommand
和TypeFlag
来帮助您。这样,您可以根据右键单击的元素添加或删除上下文菜单项。
MenuHandler.cs
internal class MenuHandler : IContextMenuHandler
{
private const int SaveImage = 26503;
private const int OpenLinkNewTab = 26501;
public event EventHandler OnSaveImage = delegate { };
void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
{
if(parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents)
{
model.AddItem((CefMenuCommand)SaveImage, "Save image");
}
if(!string.IsNullOrEmpty(parameters.UnfilteredLinkUrl))
{
model.AddItem((CefMenuCommand)OpenLinkNewTab, "Open link in new tab");
}
}
bool IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
{
return false;
}
void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
if ((int)commandId == SaveImage)
{
OnSaveImage?.Invoke(this, new ImageSaveEventArgs(parameters.SourceUrl)); //ImageSaveEventArgs is just a class with one property that houses the source url of the image to download.
}
}
bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
{
return false;
}
}
然后,无论您在何处创建ChromiumWebBrowser
实例,都可以执行以下操作:
ChromiumWebBrowser browser = new ChromiumWebBrowser();
MenuHandler menuHandler = new MenuHandler();
menuHandler.OnSaveImage += Handler_OnSaveImage;
browser.MenuHandler = menuHandler;
private void Handler_OnSaveImage(object sender, EventArgs e)
{
DownloadImage(((ImageSaveEventArgs)e).SourceUrl);
}
注意,这只是使用内置IContextMenuHandler
获取用户右键单击的内容,然后处理我自己的事件以便实现所需行为的示例。在这种情况下,可以从URL下载文件。
有关更多详细信息和其他示例,请参阅CefSharp
的GitHub页面上的MenuHandler.cs。