Utwórz skrót na pulpicie


106

Chcę utworzyć skrót wskazujący plik EXE na pulpicie, używając .NET Framework 3.5 i opierając się na oficjalnym Windows API. Jak mogę to zrobić?


1
Użycie modelu obiektu hosta skryptów systemu Windows od Rustama Irzaeva jest jedynym niezawodnym rozwiązaniem dla prawidłowego skrótu. ayush: Ta technika pomija kilka funkcji, takich jak klawisze skrótu i ​​opisy. Thorarin: ShellLink działa dobrze w większości przypadków, ale przede wszystkim nie działa w systemie Windows XP i tworzy nieprawidłowe skróty. Simon Mourier: To było bardzo obiecujące, ale tworzy nieprawidłowe skróty w systemie Windows 8.
BrutalDev

Najlepszą odpowiedzią jest tutaj Simon Mourier. Jedynym poprawnym i niezawodnym sposobem tworzenia skrótów jest użycie tego samego API, którego używa system operacyjny, a jest to interfejs IShellLink. Nie używaj hosta skryptów systemu Windows ani nie twórz łączy internetowych! Simon Mourier pokazuje, jak to zrobić za pomocą 6 linii kodu. Każdy, kto miał problemy z tą metodą PEWNIE przekazał nieprawidłowe ścieżki. Przetestowałem jego kod na Windows XP, 7 i 10. Skompiluj swoją aplikację jako „Dowolny procesor”, aby uniknąć problemów z 32/64-bitowym systemem Windows, które używają różnych folderów dla Program Files i in.
Elmue

Odpowiedzi:


120

Z dodatkowymi opcjami, takimi jak klawisz skrótu, opis itp.

Najpierw Projekt > Dodaj odwołanie > COM > Model obiektu hosta skryptów systemu 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
To było dla mnie naprawdę bliskie. Musiałem dodać katalog .exe do właściwości „WorkingDirectory” w skrócie. (shortcut.WorkingDirectory) +1
samuelesque

4
Aby określić indeks ikon (w IconLocation), użyj wartości takiej jak „path_to_icon_file, #”, gdzie # to indeks ikony. Zobacz msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
Chris

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

7
Environment.SpecialFolders.System - nie istnieje ... Environment.SpecialFolder.System - działa.
JSWulf

przez pewien czas musisz również dodać Microsoft.CSharp jako odniesienie.
l1nuxuser

76

Skrót adresu 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);
    }
}

Skrót do aplikacji

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

Sprawdź również ten przykład .

Jeśli chcesz użyć niektórych funkcji specyficznych dla interfejsu API, będziesz chciał użyć zarówno, IShellLink interfacejak i IPersistFile interface(przez interop COM).

Oto artykuł, w którym szczegółowo opisano, czego potrzebujesz, aby to zrobić, a także przykładowy kod.


Te powyżej działają dobrze. Ale chcę utworzyć skrót za pomocą niektórych funkcji API, takich jak DllImport ("coredll.dll")] public static extern int SHCreateShortcut (StringBuilder szShortcut, StringBuilder szTarget);
Vipin Arora

@Vipin dlaczego? Czy jest jakiś powód, dla którego którekolwiek z powyższych rozwiązań nie jest wystarczająco dobre?
Alex

8
czepianie się: możesz usunąć linię flush (), ponieważ zakończenie bloku Using powinno załatwić to za Ciebie
Newtopian

3
Miałem wiele problemów z tą metodą ... Windows ma tendencję do buforowania gdzieś definicji skrótu ... utwórz taki skrót, usuń go, a następnie utwórz taki o tej samej nazwie, ale innym adresie URL ... prawdopodobnie są okna otworzy stary usunięty adres URL po kliknięciu skrótu. Odpowiedź Rustama poniżej (używając .lnk zamiast .url) rozwiązała ten problem dla mnie
TCC

1
Świetna odpowiedź. Znacznie lepsze niż okropna hydraulika COM, z którą masz do czynienia podczas korzystania z plików .lnk.
James Ko

61

Oto fragment kodu, który nie jest zależny od zewnętrznego obiektu COM (WSH) i obsługuje programy 32-bitowe i 64-bitowe:

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 - Co nie działa? Przetestowałem to na Windows 8 x64 i działa.
Simon Mourier

Również działający pod Win8 x64, skopiowałem powyższy przykładowy kod dokładnie tak, jak jest, tworzy ikonę na moim pulpicie bez ścieżki. Uruchomienie linku powoduje po prostu otwarcie eksploratora na pulpicie. Jest to podobny problem, który miałem w przypadku ShellLink.cs, ale w systemie Windows XP / 2003. Jedynym przykładem, który definitywnie działa we wszystkich wersjach systemu Windows, było użycie WSHOM przez Rustama Irzaeva, jak wspomniałem w komentarzu do głównego pytania: „To było bardzo obiecujące, ale tworzy nieprawidłowe skróty w systemie Windows 8”
BrutalDev

Mam to do pracy w systemie Windows 8.1 x64, ale kod podany tutaj w tej chwili nie ma definicji dla IPersistFile. Musiałem to skopiować z postu ShellLink.cs, aby to zadziałało.
Walter Wilfinger,

Nie widzę żadnego namacalnego powodu, dla którego to nie zadziałałoby. W każdym razie IPersistFile jest dostępny od razu po wyjęciu z pudełka w System.Runtime.InteropServices.ComTypes
Simon Mourier

1
To rozwiązanie nie ustawia prawidłowej ikony SetIconLocationw 64-bitowym systemie Windows 10 z 32-bitowym plikiem wykonywalnym. Rozwiązanie jest opisane tutaj: stackoverflow.com/a/39282861 i podejrzewam również, że jest to ten sam problem z Windows 8, do którego odnoszą się wszyscy inni. Może to być związane z 32-bitowymi plikami exe w 64-bitowym systemie Windows.
Maris B.

26

Możesz użyć tej klasy ShellLink.cs do utworzenia skrótu.

Aby uzyskać katalog pulpitu, użyj:

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

lub użyj, Environment.SpecialFolder.CommonDesktopDirectoryaby utworzyć go dla wszystkich użytkowników.


6
@Vipin: jeśli rozwiązanie działa dla Ciebie, zwyczajowo głosuje się za nim. Powinieneś także wybrać najlepsze rozwiązanie i zaakceptować je jako odpowiedź na swój problem.
Thorarin

Spowoduje to nadpisanie istniejącego exe plikiem lnk. Testowane na Win10.
zwcloud

@zwcloud Ten kod nie nadpisuje niczego, ponieważ nic nie robi. Mówi tylko, jakich klas i metod należy używać do pracy ze skrótami. Jeśli twój kod nadpisuje exe, który jest na tobie. Przyjrzałbym się, jak faktycznie tworzysz plik lnk, aby zobaczyć, dlaczego niszczy twój exe.
Cdaragorn

15

Bez dodatkowego odniesienia:

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

Aby utworzyć skrót na pulpicie:

    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

Używam po prostu dla mojej aplikacji:

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

Działa po wyjęciu z pudełka, po prostu skopiuj i wklej
rluks

9

Użyj ShellLink.cs w vbAccelerator, aby łatwo utworzyć skrót!

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
To łącze jest teraz martwe, ale zarchiwizowaną wersję można znaleźć tutaj .
pswg

7

Oto mój kod:

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

EDYTOWAĆ: Nie polecam już tego rozwiązania. Jeśli nadal nie ma lepszej metody niż użycie silnika skryptów systemu Windows, użyj przynajmniej rozwiązania @ Mehmet, które wywołuje silnik bezpośrednio, zamiast tworzyć zwykły skrypt tekstowy w pamięci.

Użyliśmy VBScript do wygenerowania skrótu. Nie wymaga p / Invoke, COM Interop i dodatkowych bibliotek DLL. Działa to tak:

  • Wygeneruj VBScript w czasie wykonywania z określonymi parametrami metody CreateShortcut C #
  • Zapisz ten VBScript w pliku tymczasowym
  • Poczekaj, aż skrypt się zakończy
  • Usuń plik tymczasowy

Proszę bardzo:

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

Oto (przetestowana) metoda rozszerzenia z komentarzami, które mogą Ci pomóc.

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

I przykład użycia:

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

Pierwszy parametr ustawia nazwę exe (znalezioną w bieżącym katalogu). Drugi parametr to folder „Rozpocznij w”, a trzeci parametr to opis skrótu.

Przykład użycia tego kodu

Konwencja nazewnictwa linku nie pozostawia wątpliwości co do tego, co zrobi. Aby przetestować łącze, kliknij je dwukrotnie.

Uwaga końcowa: sama aplikacja (cel) musi mieć skojarzony z nią obraz IKONY. Link jest w stanie łatwo zlokalizować IKONĘ w exe. Jeśli aplikacja docelowa ma więcej niż jedną ikonę, możesz otworzyć właściwości łącza i zmienić ikonę na inną, którą można znaleźć w exe.


Otrzymuję komunikat o błędzie, że .GetFolderPath () nie istnieje. To samo dotyczy XFile.Delete. czego mi brakuje?
RalphF,

Czy występuje tutaj błąd? Environment.SpecialFolder.Startup.GetFolderPath ();
John Peters,

2

Do tworzenia skrótu używam odniesienia „Windows Script Host Object Model”.

Dodanie „Windows Script Host Object Model” do odniesień do projektu

i utworzyć skrót do określonej lokalizacji:

    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

Stworzyłem klasę opakowującą na podstawie odpowiedzi Rustama Irzaeva przy użyciu IWshRuntimeLibrary.

IWshRuntimeLibrary -> References -> COM> Model obiektu hosta skryptów systemu 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

W systemie Windows Vista / 7/8/10 zamiast tego można utworzyć łącze symboliczne za pośrednictwem mklink.

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

Alternatywnie, zadzwoń CreateSymbolicLinkprzez P / Invoke.


Nie ma to nic wspólnego ze skrótem.
Matt,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.