web-dev-qa-db-fra.com

Création d'un raccourci d'application dans un répertoire

Comment créer un raccourci d'application (fichier .lnk) en C # ou utiliser le framework .NET?

Le résultat serait un fichier .lnk vers l'application ou l'URL spécifiée.

70
Chasler

Ce n'est pas aussi simple que j'aurais aimé, mais il y a un excellent appel de classe ShellLink.cs à vbAccelerator

Ce code utilise l'interopérabilité, mais ne dépend pas de WSH.

En utilisant cette classe, le code pour créer le raccourci est:

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

Agréable et propre. (. 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);
}

Voilà, aucun code supplémentaire n'est nécessaire. CreateShortcut peut même charger un raccourci depuis un fichier, donc des propriétés comme TargetPath renvoient les informations existantes. Propriétés des objets de raccourci .

Également possible de cette façon pour les versions de types dynamiques ne prenant pas en charge .NET. (. 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

J'ai trouvé quelque chose comme ça:

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();
    }
}

Code d'origine sur article de sorrowman "url-link-to-desktop"

14
Anuraj

Similaire à réponse d'IllidanS4 , l'utilisation de Windows Script Host s'est avérée être la solution la plus simple pour moi (testée sur Windows 8 64 bits).

Cependant, plutôt que d'importer le type COM manuellement via du code, il est plus facile d'ajouter simplement la bibliothèque de types COM comme référence. Choisissez References->Add Reference..., COM->Type Libraries et recherchez et ajoutez "Modèle d'objet hôte de script Windows" .

Cela importe l'espace de noms IWshRuntimeLibrary, à partir duquel vous pouvez accéder:

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

Le crédit revient à Jim Hollenhorst .

1
Steven Jeuris

Télécharger IWshRuntimeLibrary

Vous devez également importer la bibliothèque COM IWshRuntimeLibrary. Cliquez avec le bouton droit sur votre projet -> ajouter une référence -> COM -> IWshRuntimeLibrary -> ajouter, puis utilisez l'extrait de code suivant.

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_

Après avoir examiné toutes les possibilités que j'ai trouvées sur SO je me suis installé ShellLink :

//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;
    ...
}

En plus d'être simple et efficace, l'auteur (Mattias Sjögren, MS MVP) est une sorte de gourou COM/PInvoke/Interop, et en parcourant son code, je pense qu'il est plus robuste que les alternatives.

Il convient de mentionner que les fichiers de raccourcis peuvent également être créés par plusieurs utilitaires de ligne de commande (qui à leur tour peuvent être facilement invoqués à partir de C # /. NET). Je n'en ai jamais essayé, mais je commencerais par NirCmd (NirSoft a des outils de qualité de type SysInternals).

Malheureusement, NirCmd ne peut pas analyser les fichiers de raccourcis (seulement les créer), mais à cet effet TZWorks lp semble capable. Il peut même formater sa sortie en csv. lnk-parser semble bien aussi (il peut sortir à la fois HTML et CSV).

1
Ohad Schneider