Как получить значок сайта при использовании элемента управления WebBrowser? - PullRequest
4 голосов
/ 07 апреля 2010

В мое приложение встроен элемент управления Windows Forms WebBrowser.Есть ли способ получить значок веб-страницы с помощью API WebBrowser или HtmlDocument?Даже получения его из локальной файловой системы будет достаточно.Загрузка иконки как отдельная операция была бы последним средством ...

Спасибо.

Ответы [ 4 ]

9 голосов
/ 07 апреля 2010

Просто скачайте файл /favicon.ico с помощью GET или чего-то подобного (как и для любого другого файла).
Вы также можете проанализировать страницу, чтобы найти значок, который может быть также png. По умолчанию это файл 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 (Попробуйте)
Вы получите 16x16 PNG-изображение значка YouTube на ICO.

http://www.google.com/s2/favicons?domain=stackoverflow.com (Попробуйте)
Это даст вам значок стека переполнения в том же формате.

Это может показаться удивительным, но не забывайте, этот сервис Google официально не поддерживается , и они могут удалить его в любое время.

2 голосов
/ 08 апреля 2010

А элемент управления веб-браузера не имеет адресной строки, поэтому у него нет интерфейса прикладного программирования для таких функций адресной строки, как favicon.

1 голос
/ 07 апреля 2010

favicon - это отдельный файл.Он не является частью HTML страницы.

Вам нужно будет получить его в отдельном вызове.

0 голосов
/ 06 мая 2015

Мне тоже нужно было это сделать, поэтому я написал это. Обратите внимание, что я использую собственный COM-элемент управления WebBrowser вместо .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());
}
...