4

アプリケーションにWindowsフォームWebブラウザコントロールが埋め込まれています。WebBrowserまたはHtmlDocumentAPIのいずれかを使用してWebページファビコンを取得する方法はありますか?ローカルファイルシステムから取得するだけでも十分です。別の操作としてアイコンをダウンロードすることは、最後の手段になります...

ありがとう。

4

4 に答える 4

10

GETなどを使用して/favicon.icoファイルをダウンロードするだけです(他のファイルの場合と同じように)。ページを解析して、pngである可能性
のあるファビコンを見つけることもできます。デフォルトでは、ICOファイルです。

ファビコンファイルの場所は通常、ページ<link rel="shortcut icon" href="/favicon.ico" /><head>ノードにあります。

また、一部のブラウザは、デフォルトで/favicon.ico(つまり、Webサイトのルートフォルダにあるfavicon.icoファイル)をその要素のページをチェックせずにダウンロードしようとします。

他のアイデアは、GoogleのS2を使用することです:

http://www.google.com/s2/favicons?domain=youtube.com (試してみてください)
これにより、YouTubeのICOファビコンの16x16PNG画像が得られます。

http://www.google.com/s2/favicons?domain=stackoverflow.com (試してみてください)
これにより、同じ形式のstackoverflowファビコンが取得されます。

素晴らしいように見えるかもしれませんが、忘れないでください。このGoogleサービスは公式にはサポートされておらず、いつでも削除される可能性があります。

于 2010-04-07T14:58:08.987 に答える
2

また、Webブラウザコントロールにはアドレスバーがないため、ファビコンなどのアドレスバー機能用のアプリケーションプログラミングインターフェイスがありません。

于 2010-04-08T19:12:25.790 に答える
1

は別のファイルですfavicon これはページHTMLの一部ではありません。

別の呼び出しでそれをフェッチする必要があります。

于 2010-04-07T14:55:56.013 に答える
0

私もこれをする必要があったので、これを書きました。.NetWrapperの代わりにネイティブのWebBrowserCOMコントロールを使用していることに注意してください。したがって、.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());
}
于 2015-05-06T16:23:39.967 に答える