webbrowser ページごとのアイコンについて

タグの編集
投稿者 wii  (社会人) 投稿日時 2009/11/1 07:30:21


初質問です。
今、webbrowserコントロールでブラウザを作っています。
タイトルは
[CODE]

Me.Text=WebBrowser.DocumentTytle

[CODE]
でできました。でも、IEのようにページごとのアイコン(gooだったらピンクの「g」みたいな)
が表示できません。
MSDNのWebBrowserメンバを見てもありません。
どうにかなりませんか?
投稿者 wii  (中学生) 投稿日時 2009/11/1 07:33:57
すみません中学生です
投稿者 あにす  (社会人) 投稿日時 2009/11/1 17:11:18
Favicon(ファビコン)というもので、下記ページで仕様を知ることが出来ます。

Favicon - Wikipedia
http://ja.wikipedia.org/wiki/Favicon
投稿者 るきお  (社会人) 投稿日時 2009/11/2 02:13:18
こんにちは。
ページごとのアイコンをどこに表示したいのかわかりませんでしたが、
仮にフォームのアイコンとして表示したいものと考えてプログラムしてみました。


…が、結構大変そうなのでめげて中途半端です。
googleはいけます。

  
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim icon As Icon
        icon = GetWebSiteIcon("http://www.google.co.jp")

        If icon IsNot Nothing Then
            Me.Icon = icon
        Else
            Me.Icon = Nothing
        End If

    End Sub

    Private Function GetWebSiteIcon(ByVal url As StringAs Icon

        Dim icon As Icon
        Dim webpage As System.Net.HttpWebRequest = Net.WebRequest.Create(url & "/favicon.ico")

        Dim response As System.Net.WebResponse

        Try
            response = webpage.GetResponse()
        Catch ex As Net.WebException
            
        End Try


        If response IsNot Nothing AndAlso response.ContentType.ToUpper.StartsWith("IMAGE/"Then
            'ルートディレクトリにfavicon.icoがある場合 
            Dim iconFolderName As String = Application.StartupPath & "\icon"

            If IO.Directory.Exists(iconFolderName) = False Then
                IO.Directory.CreateDirectory(iconFolderName)
            End If

            Dim iconFileFullPath As String = iconFolderName & "\temp.ico"
            Dim reader As New IO.BinaryReader(response.GetResponseStream)
            IO.File.WriteAllBytes(iconFileFullPath, reader.ReadBytes(response.ContentLength))
            reader.Close()
            icon = New Icon(iconFileFullPath)

        Else
            'その他の場合(未実装) 
           
        End If

        response.Close()

        Return icon
    End Function


あにすさんの情報の
http://ja.wikipedia.org/wiki/Favicon 
をプログラムで表現しようとしたのですが、

要するにWebサイト側でのアイコンの場所は
1.ルートディレクトリ直下のfavicon.ico
2.html内のタグで指定
の2パターンがあって、
上記サンプルでは1の方に中途半端に対応していて、2のほうは無対応です。

メジャーなブラウザ並みに対応しようと思ったら結構大変そうな感触です。
IEにはこのロジックが実装されているはずなのだからWebBrowserコントロール経由で
もっと簡単に持ってくる方法があるような気がします。

どなたかご存じないですか?
投稿者 あにす  (社会人) 投稿日時 2009/11/2 03:29:14
簡単かというと怪しいですが…DOMってみました。

Imports System.Net
Imports System.IO

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        Me.WebBrowser1.Navigate("http://blogs.dion.ne.jp/anis7742/")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.ObjectByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        For Each linkTag As HtmlElement In Me.WebBrowser1.Document.GetElementsByTagName("link")
            Dim relAttribute As String = linkTag.GetAttribute("rel")
            Dim iconUrl As String
            If relAttribute = "shortcut icon" OrElse relAttribute = "icon" Then
                iconUrl = linkTag.GetAttribute("href")

                If iconUrl.StartsWith("http"Then      '完全なURLの場合 
                    Me.Icon = getIconFromUrl(iconUrl)
                ElseIf iconUrl.StartsWith("/"Then     '絶対URLの場合 
                    Me.Icon = getIconFromUrl("http://" + e.Url.Host + iconUrl)
                Else                                    '相対URLの場合 
                    Me.Icon = getIconFromUrl(e.Url.ToString() + iconUrl)
                End If

                Exit For
            End If
        Next

        'タグでの指定が無い場合 
        Me.Icon = getIconFromUrl("http://" + e.Url.Host + "/favicon.ico")
    End Sub

    Private Function getIconFromUrl(ByVal url As StringAs Icon
        Using webClient As New WebClient
            Dim icondata As Byte() = webClient.DownloadData(url)
            Using stream As New MemoryStream(icondata)
                Return New Icon(stream)
            End Using
        End Using
    End Function

End Class

投稿者 wii  (中学生) 投稿日時 2009/11/2 04:24:05
みなさん、ありがとうございました!!
おかげさまで今、作ったブラウザで書き込んでいます!
また質問すると思いますが、そのときはまたよろしくお願いします!
投稿者 るきお  (社会人) 投稿日時 2009/11/2 05:44:15
あにすさん、素晴らしいです!