Buat pintasan di Desktop


106

Saya ingin membuat pintasan yang menunjuk ke beberapa file EXE, di desktop, menggunakan .NET Framework 3.5 dan mengandalkan API Windows resmi. Bagaimana saya bisa melakukan itu?


1
Menggunakan Model Objek Host Skrip Windows dari Rustam Irzaev adalah satu-satunya yang dapat diandalkan untuk pintasan yang tepat. ayush: Teknik ini merindukan banyak fitur seperti hot key dan deskripsi. Thorarin: ShellLink berfungsi dengan baik dalam banyak kasus, tetapi terutama itu tidak berfungsi di Windows XP dan membuat pintasan yang tidak valid. Simon Mourier: Ini sangat menjanjikan, tetapi membuat pintasan yang tidak valid di Windows 8.
BrutalDev

Jawaban dari Simon Mourier adalah jawaban terbaik disini. Satu-satunya cara yang benar dan anti peluru untuk membuat pintasan adalah menggunakan API yang sama yang digunakan sistem operasi dan ini adalah antarmuka IShellLink. Jangan gunakan Windows Script Host atau buat tautan Web! Simon Mourier menunjukkan bagaimana melakukan ini dengan 6 baris kode. Siapapun yang bermasalah dengan metode ini PASTI melewati jalur yang tidak valid. Saya menguji kodenya pada Windows XP, 7 dan 10. Kompilasi aplikasi Anda sebagai "Semua CPU" untuk menghindari masalah dengan Windows 32/64 bit yang menggunakan folder berbeda untuk Program Files, dkk.
Elmue

Jawaban:


120

Dengan opsi tambahan seperti hotkey, deskripsi, dll.

Pada awalnya, Proyek > Tambahkan Referensi > COM > Model Objek Host Skrip 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
Ini sangat dekat bagiku. Saya perlu menambahkan direktori .exe ke properti "WorkingDirectory" pada pintasan. (shortcut.WorkingDirectory) +1
samuelesque

4
Untuk menentukan indeks ikon (di IconLocation), gunakan nilai seperti "path_to_icon_file, #", di mana # adalah indeks ikon. Lihat msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
Chris

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

7
Environment.SpecialFolders.System - tidak ada ... Environment.SpecialFolder.System - berfungsi.
JSWulf

untuk saat ini Anda juga perlu menambahkan Microsoft.CSharp sebagai referensi.
l1nuxuser

76

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

Pintasan aplikasi

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

Periksa juga contoh ini .

Jika Anda ingin menggunakan beberapa fungsi khusus API, maka Anda akan ingin menggunakan IShellLink interfacesertaIPersistFile interface (melalui interop COM).

Berikut adalah artikel yang menjelaskan secara mendetail apa yang perlu Anda lakukan, serta kode contoh.


Ini di atas berfungsi dengan baik. Tapi saya ingin membuat jalan pintas melalui beberapa fungsi API seperti DllImport ("coredll.dll")] public static extern int SHCreateShortcut (StringBuilder szShortcut, StringBuilder szTarget);
Vipin Arora

@Vipin kenapa? Adakah alasan mengapa salah satu solusi di atas tidak cukup baik?
alex

8
nitpicking: Anda dapat menghapus garis flush () karena penghentian blok Menggunakan harus mengurusnya untuk Anda
Newtopian

3
Saya mengalami banyak masalah dengan metode ini ... Windows cenderung menyimpan definisi pintasan di suatu tempat ... buat pintasan seperti ini, hapus, lalu buat dengan nama yang sama tetapi URL yang berbeda ... kemungkinan besar windows akan membuka URL lama yang dihapus saat Anda mengklik pintasan. Jawaban Rustam di bawah ini (menggunakan .lnk daripada .url) memecahkan masalah ini untuk saya
TCC

1
Jawaban yang luar biasa. Jauh lebih baik daripada pipa COM yang mengerikan yang harus Anda tangani saat menggunakan file .lnk.
James Ko

61

Berikut adalah potongan kode yang tidak memiliki ketergantungan pada objek COM eksternal (WSH), dan mendukung program 32-bit dan 64-bit:

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 - Apa yang tidak berhasil? Saya telah mengujinya di Windows 8 x64 dan berhasil.
Simon Mourier

Juga menjalankan Win8 x64, menyalin contoh kode di atas persis seperti itu, itu membuat ikon di desktop saya tanpa jalur. Menjalankan tautan hanya membuka explorer ke desktop. Ini adalah masalah serupa yang saya alami dengan ShellLink.cs tetapi di Windows XP / 2003. Satu-satunya contoh yang pasti bekerja di semua versi Windows adalah Rustam Irzaev menggunakan WSHOM seperti yang saya sebutkan dalam komentar saya untuk pertanyaan utama: "Ini sangat menjanjikan, tetapi membuat pintasan tidak valid di Windows 8"
BrutalDev

Saya mendapatkan ini untuk bekerja pada Windows 8.1 x64, tetapi kode yang diberikan di sini sekarang tidak memiliki definisi untuk IPersistFile. Saya harus menyalinnya dari posting ShellLink.cs agar bisa berfungsi.
Walter Wilfinger

Saya tidak melihat alasan nyata mengapa ini tidak berhasil. Bagaimanapun, IPersistFile tersedia out-of-the-box di System.Runtime.InteropServices.ComTypes
Simon Mourier

1
Solusi ini tidak mengatur ikon yang benar menggunakan SetIconLocationpada 64-bit Windows 10 dengan 32-bit yang dapat dieksekusi. Solusi dijelaskan di sini: stackoverflow.com/a/39282861 dan saya juga menduga, bahwa itu adalah masalah yang sama dengan Windows 8 yang dirujuk oleh semua lainnya. Ini mungkin terkait dengan file exe 32-bit pada Windows 64-bit.
Maris B.

26

Anda dapat menggunakan ShellLink.cs ini kelas untuk membuat pintasan.

Untuk mendapatkan direktori desktop, gunakan:

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

atau gunakan Environment.SpecialFolder.CommonDesktopDirectoryuntuk membuatnya untuk semua pengguna.


6
@Vipin: jika solusi berhasil untuk Anda, biasanya upvote. Selain itu, Anda harus memilih solusi terbaik dan menerimanya sebagai jawaban atas masalah Anda.
Thorarin

Ini akan menimpa exe yang ada dengan file lnk. Diuji di Win10.
zwcloud

@zwcloud Kode ini tidak menimpa apa pun karena tidak melakukan apa pun. Ini hanya memberi tahu Anda kelas dan metode apa yang digunakan untuk bekerja dengan pintasan. Jika kode Anda menimpa exe yang ada pada Anda. Saya akan melihat bagaimana Anda sebenarnya membuat file lnk untuk melihat mengapa itu merusak exe Anda.
Cdaragorn

15

Tanpa referensi tambahan:

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

Untuk membuat Pintasan di Desktop:

    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

Saya Gunakan hanya untuk aplikasi saya:

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

Berfungsi di luar kotak, cukup salin-tempel
rluks

9

Gunakan ShellLink.cs di vbAccelerator untuk membuat pintasan Anda dengan mudah!

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
Tautan tersebut sekarang sudah mati, tetapi Anda dapat menemukan versi yang diarsipkan di sini .
pswg

7

Ini kode saya:

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: Saya tidak merekomendasikan solusi ini lagi. Jika masih tidak ada metode yang lebih baik daripada menggunakan mesin skrip Windows, setidaknya gunakan solusi @ Mehmet yang memanggil mesin secara langsung daripada membuat skrip teks biasa di memori.

Kami menggunakan VBScript untuk membuat pintasan. Itu tidak membutuhkan p / Invoke, COM Interop dan DLL tambahan. Ini bekerja seperti ini:

  • Buat VBScript saat runtime dengan parameter tertentu dari metode CreateShortcut C #
  • Simpan VBScript ini dalam file sementara
  • Tunggu hingga skrip selesai
  • Hapus file sementara

Ini dia:

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

Inilah Metode Ekstensi (Teruji), dengan komentar untuk membantu Anda.

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

Dan contoh penggunaan:

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

Parm pertama menetapkan nama exe (ditemukan di direktori saat ini) Parm kedua adalah folder "Start In" dan parm ke-3 adalah deskripsi pintasan.

Contoh Penggunaan kode ini

Konvensi penamaan tautan tidak meninggalkan ambiguitas tentang apa yang akan dilakukannya. Untuk menguji tautan, cukup klik dua kali.

Catatan Akhir: aplikasi itu sendiri (target) harus memiliki gambar ICON yang terkait dengannya. Tautan dengan mudah dapat menemukan ICON di dalam exe. Jika aplikasi target memiliki lebih dari satu ikon, Anda dapat membuka properti tautan dan mengubah ikon tersebut ke ikon lain yang ditemukan di exe.


Saya mendapatkan pesan kesalahan bahwa .GetFolderPath () tidak ada. Sama untuk XFile.Delete. Apa yang saya lewatkan?
RalphF

Apakah kesalahan terjadi di sini? Environment.SpecialFolder.Startup.GetFolderPath ();
John Peters

2

Saya menggunakan referensi "Model Objek Host Skrip Windows" untuk membuat pintasan.

Menambahkan "Model Objek Host Skrip Windows" ke referensi proyek

dan untuk membuat pintasan di lokasi tertentu:

    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

Saya telah membuat kelas pembungkus berdasarkan jawaban Rustam Irzaev dengan menggunakan IWshRuntimeLibrary.

IWshRuntimeLibrary -> Referensi -> COM> Windows Script Host Object Model

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

Untuk Windows Vista / 7/8/10, Anda dapat membuat symlink melalui mklink.

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

Atau, hubungi CreateSymbolicLinkmelalui P / Invoke.


Ini tidak ada hubungannya dengan jalan pintas.
Matt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.