Créer un raccourci sur le bureau


106

Je souhaite créer un raccourci pointant vers un fichier EXE, sur le bureau, en utilisant .NET Framework 3.5 et en s'appuyant sur une API Windows officielle. Comment puis je faire ça?


1
L'utilisation du modèle d'objet Windows Script Host de Rustam Irzaev est la seule fiable pour un raccourci approprié. ayush: Cette technique manque un tas de fonctionnalités telles que les raccourcis clavier et les descriptions. Thorarin: ShellLink fonctionne bien dans la plupart des cas, mais notamment il ne fonctionne pas sous Windows XP et crée des raccourcis invalides. Simon Mourier: C'était très prometteur, mais cela crée des raccourcis invalides dans Windows 8.
BrutalDev

La réponse de Simon Mourier est la meilleure réponse ici. La seule façon correcte et à l'épreuve des balles de créer des raccourcis consiste à utiliser la même API que le système d'exploitation utilise et c'est l'interface IShellLink. N'utilisez pas Windows Script Host et ne créez pas de liens Web! Simon Mourier montre comment faire cela avec 6 lignes de code. Quiconque a eu des problèmes avec cette méthode a sûrement passé des chemins non valides. J'ai testé son code sur Windows XP, 7 et 10. Compilez votre application en tant que "Any CPU" pour éviter les problèmes avec Windows 32/64 bits qui utilisent différents dossiers pour Program Files, et al.
Elmue

Réponses:


120

Avec des options supplémentaires telles que raccourci clavier, description, etc.

Au début, Projet > Ajouter une référence > COM > Modèle d'objet hôte de script Windows.

using IWshRuntimeLibrary;

private void CreateShortcut()
{
  object shDesktop = (object)"Desktop";
  WshShell shell = new WshShell();
  string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Notepad.lnk";
  IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress);
  shortcut.Description = "New shortcut for a Notepad";
  shortcut.Hotkey = "Ctrl+Shift+N";
  shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\notepad.exe";
  shortcut.Save();
}

2
C'était vraiment proche pour moi. J'avais besoin d'ajouter le répertoire .exe à la propriété "WorkingDirectory" sur le raccourci. (raccourci.WorkingDirectory) +1
samuelesque

4
Pour spécifier un index d'icône (dans IconLocation), utilisez une valeur telle que "path_to_icon_file, #", où # est l'index d'icône. Voir msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
Chris

1
pour l'argument: shortcut.Arguments = "Seta Map mp_crash"; stackoverflow.com/a/18491229/2155778
Zolfaghari

7
Environment.SpecialFolders.System - n'existe pas ... Environment.SpecialFolder.System - fonctionne.
JSWulf

pour le must du temps, vous devez également ajouter Microsoft.CSharp comme référence.
l1nuxuser

76

Raccourci URL

private void urlShortcutToDesktop(string linkName, string linkUrl)
{
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

    using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url"))
    {
        writer.WriteLine("[InternetShortcut]");
        writer.WriteLine("URL=" + linkUrl);
    }
}

Raccourci d'application

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

Vérifiez également cet exemple .

Si vous souhaitez utiliser certaines fonctions spécifiques à l'API, vous souhaiterez utiliser le IShellLink interfaceainsi que le IPersistFile interface(via COM interop).

Voici un article qui explique en détail ce dont vous avez besoin pour le faire, ainsi qu'un exemple de code.


Ceux ci-dessus fonctionnent bien. Mais je veux créer un raccourci via certaines fonctions API comme DllImport ("coredll.dll")] public static extern int SHCreateShortcut (StringBuilder szShortcut, StringBuilder szTarget);
Vipin Arora le

@Vipin pourquoi? Y a-t-il une raison pour laquelle l'une des solutions ci-dessus n'est pas suffisante?
alex le

8
pinailler: vous pouvez supprimer la ligne flush () car la terminaison du bloc Using devrait s'en occuper pour vous
Newtopian

3
J'ai eu beaucoup de problèmes avec cette méthode ... Windows a tendance à mettre en cache la définition du raccourci quelque part ... créer un raccourci comme celui-ci, le supprimer, puis en créer un avec le même nom mais une URL différente ... il y a de fortes chances que Windows ouvrira l'ancienne URL supprimée lorsque vous cliquez sur le raccourci. La réponse de Rustam ci-dessous (en utilisant .lnk au lieu de .url) a résolu ce problème pour moi
TCC

1
Réponse géniale. Bien mieux que l'horrible plomberie COM que vous devez gérer lorsque vous utilisez des fichiers .lnk.
James Ko

61

Voici un morceau de code qui n'a aucune dépendance sur un objet COM externe (WSH) et prend en charge les programmes 32 bits et 64 bits:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;

namespace TestShortcut
{
    class Program
    {
        static void Main(string[] args)
        {
            IShellLink link = (IShellLink)new ShellLink();

            // setup shortcut information
            link.SetDescription("My Description");
            link.SetPath(@"c:\MyPath\MyProgram.exe");

            // save it
            IPersistFile file = (IPersistFile)link;
            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            file.Save(Path.Combine(desktopPath, "MyLink.lnk"), false);
        }
    }

    [ComImport]
    [Guid("00021401-0000-0000-C000-000000000046")]
    internal class ShellLink
    {
    }

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("000214F9-0000-0000-C000-000000000046")]
    internal interface IShellLink
    {
        void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
        void GetIDList(out IntPtr ppidl);
        void SetIDList(IntPtr pidl);
        void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
        void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
        void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
        void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
        void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
        void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
        void GetHotkey(out short pwHotkey);
        void SetHotkey(short wHotkey);
        void GetShowCmd(out int piShowCmd);
        void SetShowCmd(int iShowCmd);
        void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
        void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
        void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
        void Resolve(IntPtr hwnd, int fFlags);
        void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
    }
}

@BrutalDev - Qu'est-ce qui ne fonctionne pas? Je l'ai testé sur Windows 8 x64 et cela fonctionne.
Simon Mourier

Également exécutant Win8 x64, copié l'exemple de code ci-dessus exactement tel quel, il crée une icône sur mon bureau sans chemin. L'exécution du lien ouvre simplement l'explorateur sur le bureau. C'est un problème similaire que j'ai eu avec ShellLink.cs mais sous Windows XP / 2003. Le seul exemple qui fonctionne définitivement dans toutes les versions de Windows est l'utilisation de WSHOM par Rustam Irzaev, comme je l'ai mentionné dans mon commentaire à la question principale: "C'était très prometteur, mais crée des raccourcis non valides dans Windows 8"
BrutalDev

Je l'ai fait fonctionner sur Windows 8.1 x64, mais le code tel que donné ici pour le moment n'a pas de définition pour IPersistFile. J'ai dû copier cela à partir de la publication ShellLink.cs pour que cela fonctionne.
Walter Wilfinger

Je ne vois aucune raison tangible pour laquelle cela ne fonctionnerait pas. Quoi qu'il en soit, IPersistFile est disponible prêt à l'emploi dans System.Runtime.InteropServices.ComTypes
Simon Mourier

1
Cette solution ne définit pas l'icône correcte SetIconLocationsur Windows 10 64 bits avec un exécutable 32 bits. La solution est décrite ici: stackoverflow.com/a/39282861 et je soupçonne également que c'est le même problème avec Windows 8 auquel tous les autres font référence. Il peut être lié à des fichiers exe 32 bits sur Windows 64 bits.
Maris B.

26

Vous pouvez utiliser cette classe ShellLink.cs pour créer le raccourci.

Pour obtenir le répertoire du bureau, utilisez:

var dir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

ou utilisez Environment.SpecialFolder.CommonDesktopDirectorypour le créer pour tous les utilisateurs.


6
@Vipin: si une solution fonctionne pour vous, il est habituel de la voter. De plus, vous devez sélectionner la meilleure solution et l'accepter comme réponse à votre problème.
Thorarin

Cela écrasera l'exe existant par le fichier lnk. Testé sur Win10.
zwcloud

@zwcloud Ce code n'écrase rien car il ne fait rien. Il vous indique simplement quelles classes et méthodes utiliser pour travailler avec des raccourcis. Si votre code écrase l'exe qui est sur vous. Je regarderais comment vous créez réellement le fichier lnk pour voir pourquoi il détruit votre exe.
Cdaragorn

15

Sans référence supplémentaire:

using System;
using System.Runtime.InteropServices;

public class Shortcut
{

private static Type m_type = Type.GetTypeFromProgID("WScript.Shell");
private static object m_shell = Activator.CreateInstance(m_type);

[ComImport, TypeLibType((short)0x1040), Guid("F935DC23-1CF0-11D0-ADB9-00C04FD58A0B")]
private interface IWshShortcut
{
    [DispId(0)]
    string FullName { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0)] get; }
    [DispId(0x3e8)]
    string Arguments { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] set; }
    [DispId(0x3e9)]
    string Description { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] set; }
    [DispId(0x3ea)]
    string Hotkey { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] set; }
    [DispId(0x3eb)]
    string IconLocation { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] set; }
    [DispId(0x3ec)]
    string RelativePath { [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ec)] set; }
    [DispId(0x3ed)]
    string TargetPath { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] set; }
    [DispId(0x3ee)]
    int WindowStyle { [DispId(0x3ee)] get; [param: In] [DispId(0x3ee)] set; }
    [DispId(0x3ef)]
    string WorkingDirectory { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] set; }
    [TypeLibFunc((short)0x40), DispId(0x7d0)]
    void Load([In, MarshalAs(UnmanagedType.BStr)] string PathLink);
    [DispId(0x7d1)]
    void Save();
}

public static void Create(string fileName, string targetPath, string arguments, string workingDirectory, string description, string hotkey, string iconPath)
{
    IWshShortcut shortcut = (IWshShortcut)m_type.InvokeMember("CreateShortcut", System.Reflection.BindingFlags.InvokeMethod, null, m_shell, new object[] { fileName });
    shortcut.Description = description;
    shortcut.Hotkey = hotkey;
    shortcut.TargetPath = targetPath;
    shortcut.WorkingDirectory = workingDirectory;
    shortcut.Arguments = arguments;
    if (!string.IsNullOrEmpty(iconPath))
        shortcut.IconLocation = iconPath;
    shortcut.Save();
}
}

Pour créer un raccourci sur le bureau:

    string lnkFileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Notepad.lnk");
    Shortcut.Create(lnkFileName,
        System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "notepad.exe"),
        null, null, "Open Notepad", "Ctrl+Shift+N", null);

11

J'utilise simplement pour mon application:

using IWshRuntimeLibrary; // > Ref > COM > Windows Script Host Object  
...   
private static void CreateShortcut()
    {
        string link = Environment.GetFolderPath( Environment.SpecialFolder.Desktop ) 
            + Path.DirectorySeparatorChar + Application.ProductName + ".lnk";
        var shell = new WshShell();
        var shortcut = shell.CreateShortcut( link ) as IWshShortcut;
        shortcut.TargetPath = Application.ExecutablePath;
        shortcut.WorkingDirectory = Application.StartupPath;
        //shortcut...
        shortcut.Save();
    }

Fonctionne hors de la boîte, il suffit de copier-coller
rluks

9

Utilisez ShellLink.cs sur vbAccelerator pour créer votre raccourci facilement!

private static void AddShortCut()
{
using (ShellLink shortcut = new ShellLink())
{
    shortcut.Target = Application.ExecutablePath;
    shortcut.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
    shortcut.Description = "My Shorcut";
    shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
    shortcut.Save(SHORTCUT_FILEPATH);
}
}

3
Ce lien est maintenant mort, mais vous pouvez en trouver une version archivée ici .
pswg

7

Voici mon code:

public static class ShortcutHelper
{
    #region Constants
    /// <summary>
    /// Default shortcut extension
    /// </summary>
    public const string DEFAULT_SHORTCUT_EXTENSION = ".lnk";

    private const string WSCRIPT_SHELL_NAME = "WScript.Shell";
    #endregion

    /// <summary>
    /// Create shortcut in current path.
    /// </summary>
    /// <param name="linkFileName">shortcut name(include .lnk extension.)</param>
    /// <param name="targetPath">target path</param>
    /// <param name="workingDirectory">working path</param>
    /// <param name="arguments">arguments</param>
    /// <param name="hotkey">hot key(ex: Ctrl+Shift+Alt+A)</param>
    /// <param name="shortcutWindowStyle">window style</param>
    /// <param name="description">shortcut description</param>
    /// <param name="iconNumber">icon index(start of 0)</param>
    /// <returns>shortcut file path.</returns>
    /// <exception cref="System.IO.FileNotFoundException"></exception>
    public static string CreateShortcut(
        string linkFileName,
        string targetPath,
        string workingDirectory = "",
        string arguments = "",
        string hotkey = "",
        ShortcutWindowStyles shortcutWindowStyle = ShortcutWindowStyles.WshNormalFocus,
        string description = "",
        int iconNumber = 0)
    {
        if (linkFileName.Contains(DEFAULT_SHORTCUT_EXTENSION) == false)
        {
            linkFileName = string.Format("{0}{1}", linkFileName, DEFAULT_SHORTCUT_EXTENSION);
        }

        if (File.Exists(targetPath) == false)
        {
            throw new FileNotFoundException(targetPath);
        }

        if (workingDirectory == string.Empty)
        {
            workingDirectory = Path.GetDirectoryName(targetPath);
        }

        string iconLocation = string.Format("{0},{1}", targetPath, iconNumber);

        if (Environment.Version.Major >= 4)
        {
            Type shellType = Type.GetTypeFromProgID(WSCRIPT_SHELL_NAME);
            dynamic shell = Activator.CreateInstance(shellType);
            dynamic shortcut = shell.CreateShortcut(linkFileName);

            shortcut.TargetPath = targetPath;
            shortcut.WorkingDirectory = workingDirectory;
            shortcut.Arguments = arguments;
            shortcut.Hotkey = hotkey;
            shortcut.WindowStyle = shortcutWindowStyle;
            shortcut.Description = description;
            shortcut.IconLocation = iconLocation;

            shortcut.Save();
        }
        else
        {
            Type shellType = Type.GetTypeFromProgID(WSCRIPT_SHELL_NAME);
            object shell = Activator.CreateInstance(shellType);
            object shortcut = shellType.InvokeMethod("CreateShortcut", shell, linkFileName);
            Type shortcutType = shortcut.GetType();

            shortcutType.InvokeSetMember("TargetPath", shortcut, targetPath);
            shortcutType.InvokeSetMember("WorkingDirectory", shortcut, workingDirectory);
            shortcutType.InvokeSetMember("Arguments", shortcut, arguments);
            shortcutType.InvokeSetMember("Hotkey", shortcut, hotkey);
            shortcutType.InvokeSetMember("WindowStyle", shortcut, shortcutWindowStyle);
            shortcutType.InvokeSetMember("Description", shortcut, description);
            shortcutType.InvokeSetMember("IconLocation", shortcut, iconLocation);

            shortcutType.InvokeMethod("Save", shortcut);
        }

        return Path.Combine(System.Windows.Forms.Application.StartupPath, linkFileName);
    }

    private static object InvokeSetMember(this Type type, string methodName, object targetInstance, params object[] arguments)
    {
        return type.InvokeMember(
            methodName,
            BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
            null,
            targetInstance,
            arguments);
    }

    private static object InvokeMethod(this Type type, string methodName, object targetInstance, params object[] arguments)
    {
        return type.InvokeMember(
            methodName,
            BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
            null,
            targetInstance,
            arguments);
    }

    /// <summary>
    /// windows styles
    /// </summary>
    public enum ShortcutWindowStyles
    {
        /// <summary>
        /// Hide
        /// </summary>
        WshHide = 0,
        /// <summary>
        /// NormalFocus
        /// </summary>
        WshNormalFocus = 1,
        /// <summary>
        /// MinimizedFocus
        /// </summary>
        WshMinimizedFocus = 2,
        /// <summary>
        /// MaximizedFocus
        /// </summary>
        WshMaximizedFocus = 3,
        /// <summary>
        /// NormalNoFocus
        /// </summary>
        WshNormalNoFocus = 4,
        /// <summary>
        /// MinimizedNoFocus
        /// </summary>
        WshMinimizedNoFocus = 6,
    }
}

5

EDIT: Je ne recommande plus cette solution. S'il n'y a toujours pas de meilleure méthode que d'utiliser le moteur de script Windows, utilisez au moins la solution de @ Mehmet qui appelle le moteur directement plutôt que de créer un script en texte brut en mémoire.

Nous avons utilisé VBScript pour générer un raccourci. Il n'a pas besoin de p / Invoke, d'interopérabilité COM et de DLL supplémentaires. Cela fonctionne comme ceci:

  • Générer un VBScript au moment de l'exécution avec les paramètres spécifiés de la méthode CreateShortcut C #
  • Enregistrez ce VBScript dans un fichier temporaire
  • Attendez que le script se termine
  • Supprimer le fichier temporaire

Voici:

static string _scriptTempFilename;

/// <summary>
/// Creates a shortcut at the specified path with the given target and
/// arguments.
/// </summary>
/// <param name="path">The path where the shortcut will be created. This should
///     be a file with the LNK extension.</param>
/// <param name="target">The target of the shortcut, e.g. the program or file
///     or folder which will be opened.</param>
/// <param name="arguments">The additional command line arguments passed to the
///     target.</param>
public static void CreateShortcut(string path, string target, string arguments)
{
    // Check if link path ends with LNK or URL
    string extension = Path.GetExtension(path).ToUpper();
    if (extension != ".LNK" && extension != ".URL")
    {
        throw new ArgumentException("The path of the shortcut must have the extension .lnk or .url.");
    }

    // Get temporary file name with correct extension
    _scriptTempFilename = Path.GetTempFileName();
    File.Move(_scriptTempFilename, _scriptTempFilename += ".vbs");

    // Generate script and write it in the temporary file
    File.WriteAllText(_scriptTempFilename, String.Format(@"Dim WSHShell
Set WSHShell = WScript.CreateObject({0}WScript.Shell{0})
Dim Shortcut
Set Shortcut = WSHShell.CreateShortcut({0}{1}{0})
Shortcut.TargetPath = {0}{2}{0}
Shortcut.WorkingDirectory = {0}{3}{0}
Shortcut.Arguments = {0}{4}{0}
Shortcut.Save",
        "\"", path, target, Path.GetDirectoryName(target), arguments),
        Encoding.Unicode);

    // Run the script and delete it after it has finished
    Process process = new Process();
    process.StartInfo.FileName = _scriptTempFilename;
    process.Start();
    process.WaitForExit();
    File.Delete(_scriptTempFilename);
}

3

Voici une méthode d'extension (testée), avec des commentaires pour vous aider.

using IWshRuntimeLibrary;
using System;

namespace Extensions
{
    public static class XShortCut
    {
        /// <summary>
        /// Creates a shortcut in the startup folder from a exe as found in the current directory.
        /// </summary>
        /// <param name="exeName">The exe name e.g. test.exe as found in the current directory</param>
        /// <param name="startIn">The shortcut's "Start In" folder</param>
        /// <param name="description">The shortcut's description</param>
        /// <returns>The folder path where created</returns>
        public static string CreateShortCutInStartUpFolder(string exeName, string startIn, string description)
        {
            var startupFolderPath = Environment.SpecialFolder.Startup.GetFolderPath();
            var linkPath = startupFolderPath + @"\" + exeName + "-Shortcut.lnk";
            var targetPath = Environment.CurrentDirectory + @"\" + exeName;
            XFile.Delete(linkPath);
            Create(linkPath, targetPath, startIn, description);
            return startupFolderPath;
        }

        /// <summary>
        /// Create a shortcut
        /// </summary>
        /// <param name="fullPathToLink">the full path to the shortcut to be created</param>
        /// <param name="fullPathToTargetExe">the full path to the exe to 'really execute'</param>
        /// <param name="startIn">Start in this folder</param>
        /// <param name="description">Description for the link</param>
        public static void Create(string fullPathToLink, string fullPathToTargetExe, string startIn, string description)
        {
            var shell = new WshShell();
            var link = (IWshShortcut)shell.CreateShortcut(fullPathToLink);
            link.IconLocation = fullPathToTargetExe;
            link.TargetPath = fullPathToTargetExe;
            link.Description = description;
            link.WorkingDirectory = startIn;
            link.Save();
        }
    }
}

Et un exemple d'utilisation:

XShortCut.CreateShortCutInStartUpFolder(THEEXENAME, 
    Environment.CurrentDirectory,
    "Starts some executable in the current directory of application");

Le premier paramètre définit le nom de l'exe (trouvé dans le répertoire courant). Le deuxième paramètre est le dossier "Démarrer dans" et le troisième paramètre est la description du raccourci.

Exemple d'utilisation de ce code

La convention de dénomination du lien ne laisse aucune ambiguïté quant à ce qu'il fera. Pour tester le lien, double-cliquez dessus.

Note finale: l'application elle-même (cible) doit avoir une image ICÔNE associée. Le lien est facilement capable de localiser l'ICÔNE dans l'exe. Si l'application cible a plus d'une icône, vous pouvez ouvrir les propriétés du lien et remplacer l'icône par une autre trouvée dans l'exe.


J'obtiens un message d'erreur indiquant que .GetFolderPath () n'existe pas. Idem pour XFile.Delete. Qu'est-ce que je rate?
RalphF

Une erreur se produit-elle ici? Environment.SpecialFolder.Startup.GetFolderPath ();
John Peters

2

J'utilise la référence "Windows Script Host Object Model" pour créer un raccourci.

Ajout de "modèle d'objet hôte de script Windows" aux références de projet

et pour créer un raccourci sur un emplacement spécifique:

    void CreateShortcut(string linkPath, string filename)
    {
        // Create shortcut dir if not exists
        if (!Directory.Exists(linkPath))
            Directory.CreateDirectory(linkPath);

        // shortcut file name
        string linkName = Path.ChangeExtension(Path.GetFileName(filename), ".lnk");

        // COM object instance/props
        IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
        IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(linkName);
        sc.Description = "some desc";
        //shortcut.IconLocation = @"C:\..."; 
        sc.TargetPath = linkPath;
        // save shortcut to target
        sc.Save();
    }

0
private void CreateShortcut(string executablePath, string name)
    {
        CMDexec("echo Set oWS = WScript.CreateObject('WScript.Shell') > CreateShortcut.vbs");
        CMDexec("echo sLinkFile = '" + Environment.GetEnvironmentVariable("homedrive") + "\\users\\" + Environment.GetEnvironmentVariable("username") + "\\desktop\\" + name + ".ink' >> CreateShortcut.vbs");
        CMDexec("echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs");
        CMDexec("echo oLink.TargetPath = '" + executablePath + "' >> CreateShortcut.vbs");
        CMDexec("echo oLink.Save >> CreateShortcut.vbs");
        CMDexec("cscript CreateShortcut.vbs");
        CMDexec("del CreateShortcut.vbs");
    }

0

J'ai créé une classe wrapper basée sur la réponse de Rustam Irzaev avec l'utilisation de IWshRuntimeLibrary.

IWshRuntimeLibrary -> Références -> COM> Modèle d'objet hôte de script Windows

using System;
using System.IO;
using IWshRuntimeLibrary;
using File = System.IO.File;

public static class Shortcut
{
    public static void CreateShortcut(string originalFilePathAndName, string destinationSavePath)
    {
        string fileName = Path.GetFileNameWithoutExtension(originalFilePathAndName);
        string originalFilePath = Path.GetDirectoryName(originalFilePathAndName);

        string link = destinationSavePath + Path.DirectorySeparatorChar + fileName + ".lnk";
        var shell = new WshShell();
        var shortcut = shell.CreateShortcut(link) as IWshShortcut;
        if (shortcut != null)
        {
            shortcut.TargetPath = originalFilePathAndName;
            shortcut.WorkingDirectory = originalFilePath;
            shortcut.Save();
        }
    }

    public static void CreateStartupShortcut()
    {
        CreateShortcut(System.Reflection.Assembly.GetEntryAssembly()?.Location, Environment.GetFolderPath(Environment.SpecialFolder.Startup));
    }

    public static void DeleteShortcut(string originalFilePathAndName, string destinationSavePath)
    {
        string fileName = Path.GetFileNameWithoutExtension(originalFilePathAndName);
        string originalFilePath = Path.GetDirectoryName(originalFilePathAndName);

        string link = destinationSavePath + Path.DirectorySeparatorChar + fileName + ".lnk";
        if (File.Exists(link)) File.Delete(link);
    }

    public static void DeleteStartupShortcut()
    {
        DeleteShortcut(System.Reflection.Assembly.GetEntryAssembly()?.Location, Environment.GetFolderPath(Environment.SpecialFolder.Startup));
    }
}

-2

Pour Windows Vista / 7/8/10, vous pouvez créer un lien symbolique à la place via mklink.

Process.Start("cmd.exe", $"/c mklink {linkName} {applicationPath}");

Vous pouvez également appeler CreateSymbolicLinkvia P / Invoke.


Cela n'a rien à voir avec un raccourci.
Matt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.