25/11/2023 - SirJo ha scritto:
Non ho capito bene la domanda, ma comunque:
https://www.iprogrammatori.it/favicon.ico
Grazie, SirJo.
A dire il vero, intendevo qualcosa simile a System.Drawing.Icon.ExtractAssociatedIcon.
Ho scritto il seguente codice, che certamente non è perfetto, ma mi scarica le favicon appena il download della pagina viene completato.
Ho scritto il codice in modo che -nei limiti del possibile- risulti il più semplice possibile da interpretare, nella speranza che a qualcuno interessi e ,soprattutto, lo modifichi o mi chieda di modificarlo per un migliore funzionamento.
Ora, non mi resta che abbinare le favicon alle listview della cronologia e dei preferiti per sostituire le immagini con le icone.
Buona serata a tutti.
Private Async Sub wv_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles wv.NavigationCompleted
isBusy = False
PictureBox1.Image = My.Resources.Resource1.verde()
'cerchiamo i titolo della pagina caricata per poter costruire la stringa della cronologia
Dim html As String
html = Await wv.ExecuteScriptAsync("document.documentElement.outerHTML;")
If Not html = Nothing Then
html = Regex.Unescape(html)
html = html.Remove(0, 1)
html = html.Remove(html.Length - 1, 1)
My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\html.txt", html, False)
'ora,nel file html dobbiamo cercare due parametri : <title> e </title>
'se sono presenti, acquisiamo la stringa compresa tra questu due tag
'altrimenti non operiamo alcuna operazione
Dim doc As String = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\html.txt")
Dim indexStart As Integer = doc.IndexOf("<title>")
Dim indexStop As Integer = doc.IndexOf("</title>")
If indexStart >= 0 And indexStop >= 0 Then
titolo = doc.Substring(indexStart + 7, indexStop - (indexStart + 7))
End If
'<+++++++++++++++++++++++++++++++++++++++>
' <DOWNLOAD FILE ICO>
'<+++++++++++++++++++++++++++++++++++++++>
'oltre il titolo proviamo a scaricare il favicon
'1)leggiamo il protocollo (che potrebbe essere http o https) dall'Uri
Dim protocollo As String = wv.Source.AbsoluteUri.Substring(0, wv.Source.AbsoluteUri.IndexOf(":") + 3)
2)memorizziamo il sito
Dim dns As String = wv.Source.DnsSafeHost
'3)cerchiamo nel file html i riferimento alla favicon
Dim indexStartIco As Integer
If doc.Contains("<link rel=""shortcut icon""") Then
indexStartIco = doc.IndexOf("<link rel=""shortcut icon""")
ElseIf doc.Contains("<link rel=""icon""") Then
indexStartIco = doc.IndexOf("<link rel=""icon""")
Else
GoTo continua
End If
4)nella stringaico memorizziamo la strinha html contenente href=
Dim indexStopIco As Integer = doc.IndexOf(">", indexStartIco)
If indexStart >= 0 And indexStop >= 0 Then
Dim stringaIco As String = doc.Substring(indexStartIco, (indexStopIco - indexStartIco) + 1)
stringaIco = Replace(stringaIco, """", "")
If Not stringaIco.Contains("http") And Not stringaIco.Contains("https") Then
'stringa da inserire dopo href=
Dim stringaDopoHref As String = protocollo & dns
stringaIco = stringaIco.Insert(stringaIco.IndexOf("href=") + 5, stringaDopoHref)
End If
Dim inizioStringaHref As Integer = stringaIco.IndexOf("href=") + 5
Dim fineStringaHref As Integer
If stringaIco.Contains(".ico") Then
fineStringaHref = stringaIco.IndexOf(".ico")
ElseIf stringaIco.Contains(".png") Then
fineStringaHref = stringaIco.IndexOf(".png")
ElseIf stringaIco.Contains(".jpg") Then
fineStringaHref = stringaIco.IndexOf(".jpg")
ElseIf stringaIco.Contains(".bmp") Then
fineStringaHref = stringaIco.IndexOf(".bmp")
End If
Dim stringaHRef As String = stringaIco.Substring(inizioStringaHref, fineStringaHref - inizioStringaHref + 4)
stringaHRef = Replace(stringaHRef, """", "")
'determiniamo ora nome ed estensione del file ico,png,ecc.
'per il nome andremo a trovare "favicon"
Dim InizioNomeFile As Integer = stringaHRef.IndexOf(LCase("favicon"))
Dim FineNomeFile As Integer = stringaHRef.LastIndexOf(".")
Dim nomeFile As String = stringaHRef.Substring(InizioNomeFile, FineNomeFile - InizioNomeFile)
Dim estensioneIco As String = stringaHRef.Substring(FineNomeFile, 4)
'ora preleviamo la favicon dal sito
Dim faviconsPath As String = Application.StartupPath & "\Favicons"
If Not Directory.Exists(faviconsPath) Then Directory.CreateDirectory(faviconsPath)
Dim client = New WebClient()
Dim remoteUri As String = stringaHRef
nomeFile = faviconsPath & "\" & dns & estensioneIco
Try
client.DownloadFile(remoteUri, nomeFile)
Catch ex As Exception
GoTo continua
End Try
End If
End If
continua:
'qui inizia la registrazione del sito per la cronologia
'verifichiamo prima di tutto che il file esista
Dim esiste As Boolean = My.Computer.FileSystem.FileExists(Application.StartupPath & "\cronologia.txt")
If esiste = False Then
GoTo Registra
Exit Sub
End If
'prima di procedere verifichiamo che si tratti di un formato URI corretto
If Not wv.Source.IsAbsoluteUri Then
Exit Sub
End If
'prima di registrare una cronologia, verifichiamo se l'elemento da aggiungere esista già
Dim selectedValues As New List(Of cronologia_str)
'verifichiamo se il sito è già presente nella lista.
selectedValues = cronologia_ls.FindAll(Function(p) p.indirizzo = wv.Source.AbsoluteUri)
If selectedValues.Count > 0 Then 'c'è
'preleviamo l'indice della List
Dim indice = cronologia_ls.IndexOf(selectedValues(0))
'cancelliamo il dato dalla List
cronologia_ls.RemoveAt(indice)
'aggiungiamo il sito alla lista
Dim C As New cronologia_str
C.data = Now.ToString
C.sito = titolo
C.indirizzo = wv.Source.AbsoluteUri
If Not C.indirizzo.StartsWith("http://") And Not C.indirizzo.StartsWith("https://") Then
MsgBox("Errore nella registrazione della cronologia.")
Exit Sub
End If
cronologia_ls.Add(C)
Else 'non c'è
Registra:
'lo aggiungiamo alla lista
Dim C As New cronologia_str
C.data = Now.ToString
C.sito = titolo
C.indirizzo = wv.Source.AbsoluteUri
If Not C.indirizzo.StartsWith("http://") And Not C.indirizzo.StartsWith("https://") Then
MsgBox("Errore nella registrazione della cronologia.")
Exit Sub
End If
cronologia_ls.Add(C)
End If