Sonntag, 21. April 2013

Verknüpfungen erstellen

Es gibt einige Wege eine Verknüpfung in C# zu erstellen. Der einfachste Weg ist eine .url Datei. Wie das funktioniert kann leicht anhand eines Beispiels nachvollzogen werden:
 
//Erstellen einer Verknüpfung mit Hilfe einer .url Datei
static void createUrlShortcut(string shortcutDir, string shortcutName, string targetPath)
{
    string path = Path.Combine(shortcutDir, shortcutName + ".url");
    using (StreamWriter writer = new StreamWriter(path))
    {
        writer.WriteLine("[InternetShortcut]");
        writer.WriteLine("URL=file:///" + targetPath);
        writer.WriteLine("IconIndex=0");
        string iconPath = targetPath.Replace('\\', '/');
        writer.WriteLine("IconFile=" + iconPath);
        writer.Close();
    }
}

Allerdings ist diese Methode nicht zu empfehlen. Ein großes Problem der .url Datei ist, dass beim Aufruf über die Verknüpfung das Arbeitsverzeichnis nicht der Ordner ist, in dem das Programm gespeichert ist.
Lasst mich dies genauer erklären. Das folgende Programm gibt das aktuelle Abeitsverzeichnis aus.

Console.WriteLine(Directory.GetCurrentDirectory());

Ruft man das Programm direkt auf, wird der Ordner, in dem das Programm ist, ausgegeben. Ruft man das Programm über die .url Datei auf erhält man eine Ausgabe ähnlich zu dieser:

C:\Windows\system32

Wenn in dem aufgerufenen Programm relative Pfadangaben verwendet werden würden, würde er die Dateien nicht im eigenen Ordner suchen, sondern im system32 Ordner. So können Probleme entstehen.
Um eine "echte" Verknüfung, also ein lnk. Datei, zu erstellen, muss man zuerst das "Windows Script Host Object Model" einbinden. Klickt dazu im Visual Studio auf Projekt -> Verweis hinzufügen.
 Wählt dort den Register "COM" und sucht das "Windows Script Host Object Model".
Klickt auf OK.
Nun müsst ihr in den Projektmappen-Explorer. Öffnet dort den Ordner "Verweise" und klickt rechts auf "IWshRuntimeLibrary". Klickt dann auf "Eigenschaften".
Stellt "Interop-Typen einbetten" auf "False".
Fügt noch folgendes Using-Statement hinzu:
using IWshRuntimeLibrary;
Nun kann man mit folgendem Code eine Verknüpfung erstellen:
//Erstellt eine Verknüpfung
static void createLnkShortcut(string shortcutDir, string shortcutName, string targetPath)
{
    string path = Path.Combine(shortcutDir, shortcutName + ".lnk");
    WshShellClass shell = new WshShellClass();
    WshShortcut shortcut = (WshShortcut)shell.CreateShortcut(path);
    shortcut.TargetPath = targetPath;//Der Pfad des Ziels
    //Legt den Ordner, der targetPath beinhaltet, als Arbeitsverzeichnis fest
    shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath);
    //Hier können etwaige Startargumente eingestellt werden
    shortcut.Arguments = "TestArgument";
    //Die Beschreibung wird in den Eigenschaften der Verknüpfung angezeigt
    shortcut.Description = "Dies ist eine Verknüpfung";
    //Möchte man nicht das Standardicon der exe benutzen, kann man hier ein Icon festlegen
    //shortcut.IconLocation = "icon.ico";
    //Speichert die Verknüfung
    shortcut.Save();
}