我的应用程序中嵌入了Windows窗体WebBrowser控件。有没有办法使用WebBrowser或HtmlDocument API获取网页图标?即使从本地文件系统获取它也足够了。将图标作为单独的操作下载将是最后的手段......
感谢。
答案 0 :(得分:9)
只需使用GET或类似内容下载/favicon.ico文件(就像您对任何其他文件一样)。
您还可以解析页面以找到可能也是png的favicon。默认情况下,它是一个ICO文件。
favicon文件的位置通常位于页面<link rel="shortcut icon" href="/favicon.ico" />
节点的<head>
中。
同样,默认情况下,某些浏览器会尝试下载/favicon.ico(即网站根文件夹中的favicon.ico文件)不用检查该元素的页面。
其他想法是使用Google的S2:
http://www.google.com/s2/favicons?domain=youtube.com
(Try it)
这将为youtube的ICO图标提供 16x16 PNG图像。
http://www.google.com/s2/favicons?domain=stackoverflow.com
(Try it)
这将以相同的格式为您提供stackoverflow图标。
它可能看起来很棒,但不要忘记,此Google服务不受官方支持,他们可能会随时将其删除。
答案 1 :(得分:2)
并且webbrowser控件没有地址栏,因此它没有像favicon这样的地址栏功能的应用程序编程接口。
答案 2 :(得分:1)
favicon
是一个单独的文件。它不是HTML页面的一部分。
您需要在单独的电话中获取它。
答案 3 :(得分:0)
我也需要这样做,所以我写了这个。请注意,我使用的是本机WebBrowser COM控件而不是.Net Wrapper,因此如果您使用.Net Wrapper,则需要进行一些小的调整。
private void axWebBrowser1_DocumentComplete( object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e )
{
try
{
Uri url = new Uri((string)e.uRL);
string favicon = null;
mshtml.HTMLDocument document = axWebBrowser1.Document as mshtml.HTMLDocument;
if( document != null )
{
mshtml.IHTMLElementCollection linkTags = document.getElementsByTagName("link");
foreach( object obj in linkTags )
{
mshtml.HTMLLinkElement link = obj as mshtml.HTMLLinkElement;
if( link != null )
{
if( !String.IsNullOrEmpty(link.rel) && !String.IsNullOrEmpty(link.href) &&
link.rel.Equals("shortcut icon",StringComparison.CurrentCultureIgnoreCase) )
{
//TODO: Bug - Can't handle relative favicon URL's
favicon = link.href;
}
}
}
}
if( String.IsNullOrEmpty(favicon) && !String.IsNullOrEmpty(url.Host) )
{
if( url.IsDefaultPort )
favicon = String.Format("{0}://{1}/favicon.ico",url.Scheme,url.Host);
else
favicon = String.Format("{0}://{1}:{2}/favicon.ico",url.Scheme,url.Host,url.Port);
}
if( !String.IsNullOrEmpty(favicon) )
{
WebRequest request = WebRequest.Create(favicon);
request.BeginGetRequestStream(new AsyncCallback(SetFavicon), request);
}
}
catch
{
this.Icon = null;
}
}
private void SetFavicon( IAsyncResult result )
{
WebRequest request = (WebRequest)result.AsyncState;
WebResponse response = request.GetResponse();
Bitmap bitmap = new Bitmap(Image.FromStream(response.GetResponseStream()));
this.Icon = Icon.FromHandle(bitmap.GetHicon());
}