it-swarm.com.de

Erstellen einer Anwendungsverknüpfung in einem Verzeichnis

Wie erstellen Sie eine Anwendungsverknüpfung (.lnk-Datei) in C # oder mit .NET Framework?

Das Ergebnis wäre eine .lnk-Datei für die angegebene Anwendung oder URL.

70
Chasler

Es ist nicht so einfach, wie ich es gerne gehabt hätte, aber es gibt einen tollen Klassenaufruf ShellLink.cs at vbAccelerator

Dieser Code verwendet interop, ist jedoch nicht auf WSH angewiesen.

Mit dieser Klasse lautet der Code zum Erstellen der Verknüpfung:

private static void configStep_addShortcutToStartupGroup()
{
    using (ShellLink shortcut = new ShellLink())
    {
        shortcut.Target = Application.ExecutablePath;
        shortcut.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
        shortcut.Description = "My Shorcut Name Here";
        shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
        shortcut.Save(STARTUP_SHORTCUT_FILEPATH);
    }
}
61
Chasler

Schön und sauber. (. NET 4.0 )

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
dynamic Shell = Activator.CreateInstance(t);
try{
    var lnk = Shell.CreateShortcut("sc.lnk");
    try{
        lnk.TargetPath = @"C:\something";
        lnk.IconLocation = "Shell32.dll, 1";
        lnk.Save();
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(Shell);
}

Es wird kein zusätzlicher Code benötigt. CreateShortcut kann sogar Verknüpfungen aus Dateien laden, sodass Eigenschaften wie TargetPath vorhandene Informationen zurückgeben. Shortcut-Objekteigenschaften .

Dies ist auch für .NET-Versionen möglich, die keine dynamischen Typen unterstützen. (. NET 3.5 )

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
object Shell = Activator.CreateInstance(t);
try{
    object lnk = t.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, Shell, new object[]{"sc.lnk"});
    try{
        t.InvokeMember("TargetPath", BindingFlags.SetProperty, null, lnk, new object[]{@"C:\whatever"});
        t.InvokeMember("IconLocation", BindingFlags.SetProperty, null, lnk, new object[]{"Shell32.dll, 5"});
        t.InvokeMember("Save", BindingFlags.InvokeMethod, null, lnk, null);
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(Shell);
}
49
IllidanS4

Ich habe so etwas gefunden:

private void appShortcutToDesktop(string linkName)
{
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

    using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url"))
    {
        string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
        writer.WriteLine("[InternetShortcut]");
        writer.WriteLine("URL=file:///" + app);
        writer.WriteLine("IconIndex=0");
        string icon = app.Replace('\\', '/');
        writer.WriteLine("IconFile=" + icon);
        writer.Flush();
    }
}

Ursprünglicher Code unter Sorrowmans Artikel "url-link-to-desktop"

14
Anuraj

Ähnlich wie bei IllidanS4s Antwort erwies sich die Verwendung von Windows Script Host für mich als die einfachste Lösung (getestet unter Windows 8 64 Bit).

Anstatt den COM-Typ manuell über Code zu importieren, ist es einfacher, die COM-Typbibliothek als Referenz hinzuzufügen. Wählen References->Add Reference..., COM->Type Libraries und suchen und fügen Sie "Windows Script Host Object Model" hinzu.

Dadurch wird der Namespace IWshRuntimeLibrary importiert, von dem aus Sie auf Folgendes zugreifen können:

WshShell Shell = new WshShell();
IWshShortcut link = (IWshShortcut)Shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();

Dank geht an Jim Hollenhorst .

1
Steven Jeuris

IWshRuntimeLibrary herunterladen

Sie müssen auch die COM-Bibliothek IWshRuntimeLibrary importieren. Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Verweis hinzufügen -> COM -> IWshRuntimeLibrary -> Hinzufügen und verwenden Sie dann den folgenden Codeausschnitt.

private void createShortcutOnDesktop(String executablePath)
{
    // Create a new instance of WshShellClass

    WshShell lib = new WshShellClass();
    // Create the shortcut

    IWshRuntimeLibrary.IWshShortcut MyShortcut;


    // Choose the path for the shortcut
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    MyShortcut = (IWshRuntimeLibrary.IWshShortcut)lib.CreateShortcut(@deskDir+"\\AZ.lnk");


    // Where the shortcut should point to

    //MyShortcut.TargetPath = Application.ExecutablePath;
    MyShortcut.TargetPath = @executablePath;


    // Description for the shortcut

    MyShortcut.Description = "Launch AZ Client";

    StreamWriter writer = new StreamWriter(@"D:\AZ\logo.ico");
    Properties.Resources.system.Save(writer.BaseStream);
    writer.Flush();
    writer.Close();
    // Location for the shortcut's icon           

    MyShortcut.IconLocation = @"D:\AZ\logo.ico";


    // Create the shortcut at the given path

    MyShortcut.Save();

}
1
AZ_

Nachdem ich alle Möglichkeiten durchgesehen hatte, die ich bei SO Ich habe mich für ShellLink entschieden:

//Create new shortcut
using (var shellShortcut = new ShellShortcut(newShortcutPath)
{
     Path = path
     WorkingDirectory = workingDir,
     Arguments = args,
     IconPath = iconPath,
     IconIndex = iconIndex,
     Description = description,
})
{
    shellShortcut.Save();
}

//Read existing shortcut
using (var shellShortcut = new ShellShortcut(existingShortcut))
{
    path = shellShortcut.Path;
    args = shellShortcut.Arguments;
    workingDir = shellShortcut.WorkingDirectory;
    ...
}

Der Autor (Mattias Sjögren, MS MVP) ist nicht nur einfach und effektiv, sondern auch eine Art COM/PInvoke/Interop-Guru.

Es sollte erwähnt werden, dass Verknüpfungsdateien auch von mehreren Befehlszeilendienstprogrammen erstellt werden können (die wiederum einfach über C # /. NET aufgerufen werden können). Ich habe noch nie einen von ihnen ausprobiert, aber ich würde mit NirCmd (NirSoft hat SysInternals-ähnliche Qualitätswerkzeuge) beginnen.

Leider kann NirCmd keine Verknüpfungsdateien analysieren (nur erstellen), aber zu diesem Zweck scheint TZWorks lp in der Lage zu sein. Es kann sogar die Ausgabe als csv formatieren. lnk-parser sieht auch gut aus (es kann sowohl HTML als auch CSV ausgeben).

1
Ohad Schneider