All'inizio il problema sembrava semplice: aprire da programma una finestra di IE e caricare una pagina web.
Il tutto sarebbe risolvibile con:
Imports System
Imports System.Diagnostics
Public Module Test
Sub Navigate2(ByVal IeUrl As String)
System.Diagnostics.Process.Start("iexplore.exe", IeUrl)
End Sub
End Module
Semplice no? Ma qual'è il problema? E' che ogni volta che si richiama la funzione si apre una
nuova finestra e quindi mi potevo accontentare?
Sì effettivamente potevo ma comunque ...
La soluzione (dopo averle provate di tutte!) stava nell'importare nelle referenze del progetto il riferimento alla libreria COM
SHDocVw.dll
(quella di Internet Explorer per intenderci, sta in System32).
Una volta importata la libreria nel progetto (e capito come funziona) le cose si sono fatte più semplici.
Imports System
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Public Module Test
'Funzione pinvoke che porta la finestra in primo piano
<DllImport("user32.dll")> _
Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Sub Navigate2(ByVal IeUrl As String)
Dim shellWins As New SHDocVw.ShellWindowsClass
Dim explorer As SHDocVw.InternetExplorer
Dim en As IEnumerator = shellWins.GetEnumerator
While en.MoveNext
'cerca una finestra aperta di IE
explorer = en.Current ' l'oggetto SHDocVw.InternetExplorer corrente
explorer.Navigate2(IeUrl) 'chiama il metodo Navigate2 dell'oggetto SHDocVw.InternetExplorer corrente
SetForegroundWindow(New IntPtr(explorer.HWND)) 'porta la finestra in primo piano
Return 'esce
End While
'se il programma arriva qui vuol dire che non ha
'trovato nessuna finestra aperta ed allora procede nel modo precedente
System.Diagnostics.Process.Start("iexplore.exe", IeUrl)
End Sub
End Module
Un'ultima cosa : io volevo compiere l'operazione da una macro di Visual Studio. Dovevo quindi aggiungere il riferimento a SHDocVw
nell'ambiente dell'IDE delle Macro, ma ciò non sembrava possibile perchè nella finestra
riferimenti dell'IDE macro
non appare il Tab COM che contiene appunto la lista delle librerie COM importabili.
Ho quindi scoperto che l'IDE delle Macro carica gli assembly esclusivamente dalla directory
<Programmi>\Microsoft Visual Studio .NET 2003\Common7\IDE\PublicAssemblies.
Ho quindi creato un progetto in VS Studio, vi ho importato il riferimento a SHDocVw e l'ho compilato.
In questo modo VS Studio ci crea automaticamente l'assembly di interoperabilità con COM che si trova nella
directory
\obj del progetto ( si chiama
Interop.SHDocVw.dll).
A questo punto basta copiare questo assembly nella directory
<Programmi>\Microsoft Visual Studio .NET 2003\Common7\IDE\PublicAssemblies,
chiudere e riaprire l'IDE delle Macro, aggiungere il riferimento ... et volià.