Prendendo spunto da un post comparso sul forum MSDN vorrei proporvi un tip su come creare uno shortcut utilizzando VB.NET.
Per poter creare uno shortcut possiamo procedere in due modi: o ci studiamo la struttura del file .lnk e scriviamo una classe che è in grado di ricreare tale struttura oppure utilizziamo Windows Scripting Host.
La prima soluzione è percorribile ma laboriosa perchè la struttura di un file lnk non è banale. Chi fosse interessato a vedere come è composto, internamente, un file lnk può scaricare la seguente reference guide (link).
Io vorrei proporvi la seconda strada e realizzerò una classe che incapsula l’utilizzo di Windows Scripting Host.
L’object model di Windows Scripting Host è contenuto nella dll IWshRuntimeLibrary che può essere referenziata, nel nostro progetto, utilizzando il tab COM della finestra di aggiunta delle reference:
Tra gli oggetti che troviamo all’interno della libreria utilizzeremo la classe WshShell e la classe WshShortcut.
La prima delle due rappresenta la vera e propria shell di Windows Scripting Host e, tra i tanti metodi messi a disposizione, ha il metodo CreateShortcut() che prevede come argomento il nome dello shortcut completo di path ed estensione e restituisce un oggetto di classe WshShortcut o di classe WshUrlShortcut (in realtà il metodo, essendo COM, restituisce un object ma possiamo castare il risultato alla classe WshShortcut o WshUrlShortcut a nostro piacimento).
La chiamata al metodo CreateShortcut non crea fisicamente il link ma tale link è creato utilizzando l’oggetto restituito dal metodo. Per maggiori info sulla classe WshShell fare riferimento al seguente link.
L’oggetto WshShortcut rappresenta, quindi, un link (il WshUrlShortcut, di fatto, ha un sottoinsieme di proprietà del WshShortcut ed è pensato per il link web) e mette a disposizione tutte quelle proprietà che ci servono per definire il link stesso (ad esempio l’icona, la directory di lavoro, la descrizione, etc., etc.). Per maggiori info sulla classe WshShortcut fare riferimento al seguente link.
La classe che vogliamo realizzare prevede una serie di proprietà per la definizione dello shortcut e un metodo per il salvataggio dello stesso (in maniera del tutto analoga a quanto fa la WshShortcut) e incapsulerà l’utilizzo delle due precedenti classi di scripting.
- Imports IWshRuntimeLibrary
- Public Class Shortcut
- Public Sub New(ByVal shortcutFullName As String)
- Me.ShortcutFullName = shortcutFullName
- End Sub
- Private _ShortcutFullName As String
- Public Property ShortcutFullName As String
- Get
- Return _ShortcutFullName
- End Get
- Set(ByVal value As String)
- If String.IsNullOrWhiteSpace(value) Then Throw New ArgumentNullException("ShortcutFullName", "ShortcutFullName non può essere vuoto!")
- _ShortcutFullName = value
- End Set
- End Property
- Public Property TargetPath As String
- Public Property WindowStyle As ShortcutWindowsStyle = ShortcutWindowsStyle.NormalFocus
- Public Property Hotkey As String
- Public Property IconPath As String
- Public Property IconIndex As Int16 = 0
- Public Property Description As String
- Public Property WorkingDirectory As String
- Public Property Arguments As String
- Public Function Save() As Boolean
- Dim retval = False
- Dim shortCut As IWshShortcut = Nothing
- Dim shell As WshShell = Nothing
- Try
- shell = New WshShell()
- Catch ex As Exception
- Throw
- End Try
- If shell IsNot Nothing Then
- Try
- shortCut = CType(shell.CreateShortcut(Me.ShortcutFullName), IWshShortcut)
- Catch ex As Exception
- Throw
- End Try
- If shortCut IsNot Nothing Then
- shortCut.TargetPath = Me.TargetPath
- shortCut.WindowStyle = CInt(Me.WindowStyle)
- shortCut.Description = Me.Description
- shortCut.WorkingDirectory = Me.WorkingDirectory
- shortCut.IconLocation = String.Format("{0}, {1}", Me.IconPath, Me.IconIndex)
- shortCut.Arguments = Me.Arguments
- If Not String.IsNullOrWhiteSpace(Me.Hotkey) Then
- shortCut.Hotkey = Me.Hotkey
- End If
- Try
- shortCut.Save()
- retval = System.IO.File.Exists(Me.ShortcutFullName)
- Catch ex As Exception
- Throw
- End Try
- End If
- End If
- Return retVal
- End Function
- End Class
Come possiamo vedere, il metodo Save() (che, rispetto al corrispettivo della WshShortcut restituisce un risultato) esegue i seguenti passi:
1) Crea un istanza della classe WshShell:
- Dim shell As WshShell = Nothing
- Try
- shell = New WshShell()
- Catch ex As Exception
- Throw
- End Try
2) Se l’istanza della shell è stata effettivamente creata, crea un’istanza della classe WshShortcut:
- Try
- shortCut = CType(shell.CreateShortcut(Me.ShortcutFullName), IWshShortcut)
- Catch ex As Exception
- Throw
- End Try
3) Se l’istanza dello shortcut è stata creata, vengono valorizzate le proprietà:
- shortCut.TargetPath = Me.TargetPath
- shortCut.WindowStyle = CInt(Me.WindowStyle)
- shortCut.Description = Me.Description
- shortCut.WorkingDirectory = Me.WorkingDirectory
- shortCut.IconLocation = String.Format("{0}, {1}", Me.IconPath, Me.IconIndex)
- shortCut.Arguments = Me.Arguments
- If Not String.IsNullOrWhiteSpace(Me.Hotkey) Then
- shortCut.Hotkey = Me.Hotkey
- End If
4) Viene richiamato il metodo Save() della classe WshShortcut e controllato che il file lnk è effettivamente stato creato:
- Try
- shortCut.Save()
- retval = System.IO.File.Exists(Me.ShortcutFullName)
- Catch ex As Exception
- Throw
- End Try
Un possibile utilizzo della classe è il seguente:
- Dim desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
- Dim shortcutFullname = System.IO.Path.Combine(desktop, "Doc.lnk")
- Dim shortcut = New Shortcut(shortcutFullname)
- shortcut.WindowStyle = ShortcutWindowsStyle.NormalNoFocus
- shortcut.Description = "I miei documenti"
- shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
- shortcut.Save()
In questo esempio viene creato un link chiamato Doc.lnk sul desktop dell’utente che permette l’apertura dei documenti.
Per concludere osserviamo che una delle proprietà della classe Shortcut da noi creata è l’enumerazione:
- Public Enum ShortcutWindowsStyle
- NormalFocus = WshWindowStyle.WshNormalFocus
- NormalNoFocus = WshWindowStyle.WshNormalNoFocus
- MaximizedFocus = WshWindowStyle.WshMaximizedFocus
- MinimizeFocus = WshWindowStyle.WshMinimizedFocus
- MinimizedNoFocus = WshWindowStyle.WshMinimizedNoFocus
- Hide = WshWindowStyle.WshHide
- End Enum
che definisce i possibili valori dello stile della finestra dello shortcut incapsulando l’analoga enumerazione WshWindowStyle della IWshRuntimeLibrary.
Commenti
Cio che voglio creare è uno shortcut che punti all'applicazione vb con l'aggiunta di un parametro che è presente in un campo.
Cosi facendo lo shotcut aprirà l'applicazione che l'ha generato passandogli come parametro il valore catturato al momento della creazione dello shortcut.
Il programma si preoccuperà di aprire la scheda con quel codice.
Ho provato ad aggiungere la dll tramite COM "Script host object model", ho creato una classe e gli ho copiata quella presente su questo blog.
L'errore è su questa riga:
Public Property WindowStyle As ShortcutWindowsStyle = ShortcutWindowsStyle.NormalFocus
=> Errore BC30002
Il tipo 'ShortcutWindowsStyle' non è definito.
Ho provato ha cercare con google "ShortcutWindowsStyle" ma questa parola si trova soltanto su questo blog.
Un aiuto?
grazie mille in anticipo