Bisher gibt es im Framework keine einfache Möglichkeit eine Dateiverknüpfung zu erstellen. Eine solche Möglichkeit liese sich über eine Com-Schnittstelle bewerkstelligen. Genau diese Möglichkeit möchten wir hier vorstellen.
Dazu werden wir mit der Shell32.dll kommunizieren müssen. Wir fügen unserem Projekt einen neuen Verweis hinzu. Über die Projekteigenschaften können wir bei Verweise Com-Verweise einbinden. Wir brauchen hierfür Microsoft Shell Controls And Automation.
Nachfolgend kann diese Klasse verwendet werden:
VBC#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | ''' <summary> ''' Stellt Informationen und Methoden für die Erstellung einer Dateiverknüpfung zur Verfügung. ''' </summary> ''' <remarks></remarks> Public Class ShortcutFile #Region " Deklarationen - Felder " Private pLinkFileInfo As System.IO.FileInfo Private pShortcutFileInfo As System.IO.FileInfo Private pWorkingDirectory As System.IO.DirectoryInfo Private pArguments As String Private pDescription As String Private pShowCommand As FormWindowState #End Region #Region " Konstruktoren " ''' <summary> ''' Initialisiert eine neue Instanz der ShortcutFile-Klasse mit den angegebenen Informationen. ''' </summary> ''' <param name="fileName">Der vollständige Name der Verknüpfung.</param> ''' <param name="linkFile">Der vollständige Name der zu verknüpfenden Datei.</param> ''' <remarks></remarks> Public Sub New(ByVal fileName As String, ByVal linkFile As String) ' Prüfe, ob die Dateierweiterung keine gültige Verknüpfung darstellt If IO.Path.GetExtension(fileName) <> ".lnk" Then ' true -> Entsprechende Dateierweiterung hinzufügen fileName = fileName & ".lnk" End If ' FileInfo und DirectoryInfo aus den vollständigen Namen erstellen pLinkFileInfo = New System.IO.FileInfo(linkFile) pShortcutFileInfo = New System.IO.FileInfo(fileName) pWorkingDirectory = pShortcutFileInfo.Directory Me.ShowCommand = FormWindowState.Normal End Sub #End Region #Region " Eigenschaften " ''' <summary> ''' Ruft die Argumente für die Verknüpfung ab oder legt diese fest. ''' </summary> ''' <value></value> ''' <returns>Die Argumente für die Verknüpfung.</returns> ''' <remarks></remarks> Public Property Arguments() As String Get Return pArguments End Get Set(ByVal value As String) pArguments = value End Set End Property ''' <summary> ''' Ruft die Beschreibung für die Verknüpfung ab oder legt diese fest. ''' </summary> ''' <value></value> ''' <returns>Die Beschreibung für die Verknüpfung.</returns> ''' <remarks></remarks> Public Property Description() As String Get Return pDescription End Get Set(ByVal value As String) pDescription = value End Set End Property ''' <summary> ''' Ruft den vollständigen Name der Verknüpfung ab. ''' </summary> ''' <value></value> ''' <returns>Die Argumente für die Verknüpfung.</returns> ''' <remarks></remarks> Public ReadOnly Property FullName() As String Get Return pShortcutFileInfo.FullName End Get End Property ''' <summary> ''' Ruft den vollständigen Name der zu verknüpfenden Datei ab oder legt diesen fest. ''' </summary> ''' <value></value> ''' <returns>Der vollständige Name der zu verknüpfenden Datei.</returns> ''' <remarks></remarks> Public Property LinkFile() As String Get Return pLinkFileInfo.FullName End Get Set(ByVal value As String) pLinkFileInfo = New System.IO.FileInfo(value) End Set End Property ''' <summary> ''' Gibt den Anzeigezustand der verknüpften Datei an oder legt diesen fest. ''' </summary> ''' <value></value> ''' <returns>Der Anzeigezustand der verknüpften Datei.</returns> ''' <remarks></remarks> Public Property ShowCommand() As FormWindowState Get Return pShowCommand End Get Set(ByVal value As FormWindowState) pShowCommand = value End Set End Property ''' <summary> ''' Ruft den vollständigen Name des Arbeitsverzeichnisses ab oder legt diesen fest. ''' </summary> ''' <value></value> ''' <returns>Der vollständige Name des Arbeitsverzeichnisses.</returns> ''' <remarks></remarks> Public Property WorkingDirectory() As String Get Return pWorkingDirectory.FullName End Get Set(ByVal value As String) pWorkingDirectory = New System.IO.DirectoryInfo(value) End Set End Property #End Region #Region " Methoden - Function " ''' <summary> ''' Gibt das System.IO.FileInfo-Objekt für die Verknüpfung zurück. ''' </summary> ''' <returns>Das System.IO.FileInfo-Objekt der Verknüpfung.</returns> ''' <remarks></remarks> Public Function GetFileInfo() As System.IO.FileInfo Return pShortcutFileInfo End Function ''' <summary> ''' Gibt den Integerwert für den Anzeigezustand zurück. ''' </summary> ''' <returns>Der Integerwert für den Anzeigezustand.</returns> ''' <remarks></remarks> Private Function GetShowCommand() As Integer Select Case Me.ShowCommand Case FormWindowState.Normal Return 1 Case FormWindowState.Minimized Return 7 Case FormWindowState.Maximized Return 3 Case Else Return 1 End Select End Function #End Region #Region " Methoden - Sub " ''' <summary> ''' Erstellt die Verknüpfung auf dem Dateisystem. ''' </summary> ''' <remarks></remarks> Public Sub Create() ' Erstellt die Verknüpfung und schließt den Stream Me.GetFileInfo.Create.Close() ' Shell-Objekte deklarieren Dim sShell As New Shell32.Shell Dim sDirectory As Shell32.Folder Dim sFileInfo As Shell32.FolderItem Dim sLinkFile As Shell32.ShellLinkObject ' Verzeichnis der Verknüpfung als Shell-Objekt erzeugen sDirectory = sShell.NameSpace(Me.GetFileInfo.DirectoryName) ' Dateiname der Verknüpfung als Shell-Objekt erzeugen sFileInfo = sDirectory.Items.Item(Me.GetFileInfo.Name) ' Dateiname der zu verlinkenden Datei als Shell-Objekt erzeugen sLinkFile = CType(sFileInfo.GetLink, Shell32.ShellLinkObject) With sLinkFile ' Informationen zur Verknüpfung hinzufügen .Arguments = Me.Arguments .Description = Me.Description .Path = Me.LinkFile .ShowCommand = Me.GetShowCommand .WorkingDirectory = Me.WorkingDirectory ' Verknüpfung speichern .Save() End With ' Objekte zerstören sLinkFile = Nothing sFileInfo = Nothing sDirectory = Nothing sShell = Nothing End Sub #End Region End Class |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | /// <summary> /// Stellt Informationen und Methoden für die Erstellung einer Dateiverknüpfung zur Verfügung. /// </summary> /// <remarks></remarks> public class ShortcutFile { #region " Deklarationen - Felder " private System.IO.FileInfo pLinkFileInfo; private System.IO.FileInfo pShortcutFileInfo; private System.IO.DirectoryInfo pWorkingDirectory; private string pArguments; private string pDescription; private FormWindowState pShowCommand; #endregion #region " Konstruktoren " /// <summary> /// Initialisiert eine neue Instanz der ShortcutFile-Klasse mit den angegebenen Informationen. /// </summary> /// <param name="fileName">Der vollständige Name der Verknüpfung.</param> /// <param name="linkFile">Der vollständige Name der zu verknüpfenden Datei.</param> /// <remarks></remarks> public ShortcutFile(string fileName, string linkFile) { // Prüfe, ob die Dateierweiterung keine gültige Verknüpfung darstellt if (System.IO.Path.GetExtension(fileName) != ".lnk") { // true -> Entsprechende Dateierweiterung hinzufügen fileName = fileName + ".lnk"; } // FileInfo und DirectoryInfo aus den vollständigen Namen erstellen pLinkFileInfo = new System.IO.FileInfo(linkFile); pShortcutFileInfo = new System.IO.FileInfo(fileName); pWorkingDirectory = pShortcutFileInfo.Directory; this.ShowCommand = FormWindowState.Normal; } #endregion #region " Eigenschaften " /// <summary> /// Ruft die Argumente für die Verknüpfung ab oder legt diese fest. /// </summary> /// <value></value> /// <returns>Die Argumente für die Verknüpfung.</returns> /// <remarks></remarks> public string Arguments { get { return pArguments; } set { pArguments = value; } } /// <summary> /// Ruft die Beschreibung für die Verknüpfung ab oder legt diese fest. /// </summary> /// <value></value> /// <returns>Die Beschreibung für die Verknüpfung.</returns> /// <remarks></remarks> public string Description { get { return pDescription; } set { pDescription = value; } } /// <summary> /// Ruft den vollständigen Name der Verknüpfung ab. /// </summary> /// <value></value> /// <returns>Die Argumente für die Verknüpfung.</returns> /// <remarks></remarks> public string FullName { get { return pShortcutFileInfo.FullName; } } /// <summary> /// Ruft den vollständigen Name der zu verknüpfenden Datei ab oder legt diesen fest. /// </summary> /// <value></value> /// <returns>Der vollständige Name der zu verknüpfenden Datei.</returns> /// <remarks></remarks> public string LinkFile { get { return pLinkFileInfo.FullName; } set { pLinkFileInfo = new System.IO.FileInfo(value); } } /// <summary> /// Gibt den Anzeigezustand der verknüpften Datei an oder legt diesen fest. /// </summary> /// <value></value> /// <returns>Der Anzeigezustand der verknüpften Datei.</returns> /// <remarks></remarks> public FormWindowState ShowCommand { get { return pShowCommand; } set { pShowCommand = value; } } /// <summary> /// Ruft den vollständigen Name des Arbeitsverzeichnisses ab oder legt diesen fest. /// </summary> /// <value></value> /// <returns>Der vollständige Name des Arbeitsverzeichnisses.</returns> /// <remarks></remarks> public string WorkingDirectory { get { return pWorkingDirectory.FullName; } set { pWorkingDirectory = new System.IO.DirectoryInfo(value); } } #endregion #region " Methoden - Function " /// <summary> /// Gibt das System.IO.FileInfo-Objekt für die Verknüpfung zurück. /// </summary> /// <returns>Das System.IO.FileInfo-Objekt der Verknüpfung.</returns> /// <remarks></remarks> public System.IO.FileInfo GetFileInfo() { return pShortcutFileInfo; } /// <summary> /// Gibt den Integerwert für den Anzeigezustand zurück. /// </summary> /// <returns>Der Integerwert für den Anzeigezustand.</returns> /// <remarks></remarks> private int GetShowCommand() { switch (this.ShowCommand) { case FormWindowState.Normal: return 1; case FormWindowState.Minimized: return 7; case FormWindowState.Maximized: return 3; default: return 1; } } #endregion #region " Methoden - Sub " /// <summary> /// Erstellt die Verknüpfung auf dem Dateisystem. /// </summary> /// <remarks></remarks> public void Create() { // Erstellt die Verknüpfung und schließt den Stream this.GetFileInfo().Create().Close(); // Shell-Objekte deklarieren Shell32.Shell sShell = new Shell32.Shell(); Shell32.Folder sDirectory; Shell32.FolderItem sFileInfo; Shell32.ShellLinkObject sLinkFile); // Verzeichnis der Verknüpfung als Shell-Objekt erzeugen sDirectory = sShell.NameSpace(this.GetFileInfo().DirectoryName); // Dateiname der Verknüpfung als Shell-Objekt erzeugen sFileInfo = sDirectory.Items().Item(this.GetFileInfo().Name); // Dateiname der zu verlinkenden Datei als Shell-Objekt erzeugen sLinkFile = (Shell32.ShellLinkObject)sFileInfo.GetLink; // Informationen zur Verknüpfung hinzufügen sLinkFile.Arguments = this.Arguments; sLinkFile.Description = this.Description; sLinkFile.Path = this.LinkFile; sLinkFile.ShowCommand = this.GetShowCommand(); sLinkFile.WorkingDirectory = this.WorkingDirectory; // Verknüpfung speichern sLinkFile.Save(); // Objekte zerstören sLinkFile = null; sFileInfo = null; sDirectory = null; sShell = null; } #endregion } |
