Masaüstünde bir kısayol oluşturun


106

.NET Framework 3.5 kullanarak ve resmi bir Windows API kullanarak masaüstünde bazı EXE dosyalarına işaret eden bir kısayol oluşturmak istiyorum. Bunu nasıl yapabilirim?


1
Rustam Irzaev'in Windows Script Ana Bilgisayar Nesne Modeli'ni kullanmak, uygun bir kısayol için tek güvenilir olanıdır. ayush: Bu teknik, kısayol tuşları ve açıklamalar gibi bir dizi özelliği kaçırır. Thorarin: ShellLink çoğu durumda iyi çalışır, ancak özellikle Windows XP'de çalışmaz ve geçersiz kısayollar oluşturur. Simon Mourier: Bu çok umut vericiydi, ancak Windows 8'de geçersiz kısayollar yaratıyor.
BrutalDev

Simon Mourier'in cevabı buradaki en iyi cevaptır. Kısayollar oluşturmanın tek doğru ve kurşun geçirmez yolu, işletim sisteminin kullandığı aynı API'yi kullanmaktır ve bu IShellLink arabirimidir. Windows Komut Dosyası Ana Bilgisayarı kullanmayın veya Web bağlantıları oluşturmayın! Simon Mourier bunun nasıl yapılacağını 6 satır kodla gösteriyor. Bu yöntemle problemi olan herkes KESİNLİKLE geçersiz yollar geçti. Kodunu Windows XP, 7 ve 10'da test ettim. Program Dosyaları ve diğerleri için farklı klasörler kullanan 32/64 bit Windows ile ilgili sorunları önlemek için uygulamanızı "Herhangi bir CPU" olarak derleyin.
Elmue

Yanıtlar:


120

Kısayol tuşu, açıklama vb. Gibi ek seçeneklerle.

İlk olarak, Proje > Referans Ekle > COM > Windows Komut Dosyası Ana Bilgisayar Nesne Modeli.

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
Bu benim için gerçekten yakındı. Kısayolda .exe dizinini "WorkingDirectory" özelliğine eklemem gerekiyordu. (
kısayol.WorkingDirectory

4
Bir simge dizini belirtmek için (Simge Konumunda), "yol_to_icon_file, #" gibi bir değer kullanın; burada # simge dizinidir. Bkz msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
Chris

1
argüman için: kısayol.Arguments = "Seta Haritası mp_crash"; stackoverflow.com/a/18491229/2155778
Zolfaghari

7
Environment.SpecialFolders.System - mevcut değil ... Environment.SpecialFolder.System - çalışıyor.
JSWulf

mutlaka referans olarak Microsoft.CSharp'ı eklemeniz gerekir.
l1nuxuser

76

URL kısayolu

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

Uygulama kısayolu

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

Ayrıca bu örneğe bakın .

Bazı API'ye özgü işlevleri kullanmak istiyorsanız, IShellLink interfacehem de IPersistFile interface(COM birlikte çalışarak) kullanmak isteyeceksiniz .

İşte yapmanız gerekenlerin yanı sıra örnek kodun ayrıntılarına giren bir makale.


Yukarıdakiler iyi çalışıyor. Ancak DllImport ("coredll.dll")] public static extern int SHCreateShortcut (StringBuilder szShortcut, StringBuilder szTarget) gibi bazı API işlevleri aracılığıyla kısayol oluşturmak istiyorum;
Vipin Arora

@Vipin neden? Yukarıdaki çözümlerden herhangi birinin yeterince iyi olmamasının herhangi bir nedeni var mı?
alex

8
nitpicking: Using bloğunun sonlandırması sizin için
halledeceği

3
Bu yöntemle ilgili birçok sorun yaşadım ... Windows kısayol tanımını bir yerde önbelleğe alma eğilimindedir ... bunun gibi bir kısayol oluşturun, silin, sonra aynı adla ancak farklı bir URL ile bir tane oluşturun ... kısayolu tıkladığınızda eski silinmiş URL'yi açacaktır. Rustam'ın aşağıdaki cevabı (.url yerine .lnk kullanarak) benim için bu sorunu çözdü
TCC

1
Harika cevap. .Lnk dosyalarını kullanırken uğraşmanız gereken korkunç COM tesisatından çok daha iyi.
James Ko

61

Harici COM nesnesine (WSH) bağımlılığı olmayan ve 32 bit ve 64 bit programları destekleyen bir kod parçası:

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 - Ne çalışmıyor? Windows 8 x64 üzerinde test ettim ve çalışıyor.
Simon Mourier

Ayrıca Win8 x64 çalıştırarak, yukarıdaki kod örneğini aynen olduğu gibi kopyaladı, masaüstümde yolu olmayan bir simge oluşturdu. Bağlantının yürütülmesi, gezgini masaüstüne açar. Bu, ShellLink.cs ile yaşadığım benzer bir sorun ama Windows XP / 2003'te. Tüm Windows sürümlerinde kesin olarak çalışan tek örnek, Rustam Irzaev'in WSHOM'u ana soruya verdiğim yorumda bahsettiğim gibi kullanmasıydı: "Bu çok umut vericiydi, ancak Windows 8'de geçersiz kısayollar oluşturuyor"
BrutalDev

Bunu Windows 8.1 x64'te çalıştırdım, ancak şu anda burada verilen kodun IPersistFile için bir tanımı yok. Çalışması için ShellLink.cs gönderisinden kopyalamak zorunda kaldım .
Walter Wilfinger

Bunun işe yaramaması için somut bir neden göremiyorum. Her neyse, IPersistFile, System.Runtime.InteropServices.ComTypes
Simon Mourier

1
Bu çözüm, SetIconLocation32 bit yürütülebilir 64 bit Windows 10'da kullanıldığında doğru simgeyi ayarlamaz . Çözüm burada açıklanmaktadır: stackoverflow.com/a/39282861 ve ayrıca, diğerlerinin atıfta bulunduğu Windows 8 ile aynı sorun olduğundan şüpheleniyorum. 64 bit Windows'taki 32 bit exe dosyalarıyla ilgili olabilir.
Maris B.

26

Kısayolu oluşturmak için bu ShellLink.cs sınıfını kullanabilirsiniz.

Masaüstü dizinini almak için şunu kullanın:

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

veya Environment.SpecialFolder.CommonDesktopDirectorytüm kullanıcılar için oluşturmak için kullanın .


6
@Vipin: Bir çözüm sizin için işe yararsa, ona oy vermek gelenekseldir. Ayrıca, en iyi çözümü seçmeli ve probleminizin cevabı olarak kabul etmelisiniz.
Thorarin

Bu, lnk dosyasıyla mevcut exe'nin üzerine yazacaktır. Win10'da test edildi.
zwcloud

@zwcloud Bu kod hiçbir şey yapmadığı için hiçbir şeyin üzerine yazmaz. Kısayollarla çalışmak için hangi sınıfları ve yöntemleri kullanacağınızı söyler. Kodunuz, üzerinizdeki exe'nin üzerine yazıyorsa. Exe dosyanızı neden yok ettiğini görmek için lnk dosyasını nasıl yarattığınıza bakardım.
Cdaragorn

15

Ek referans olmadan:

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

Masaüstünde Kısayol oluşturmak için:

    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

Ben sadece uygulamam için kullanıyorum:

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

Kutudan çıktığı gibi çalışır, sadece kopyalayıp yapıştırın
rluks

9

Kullanım ShellLink.cs kolayca kısayol oluşturmak için vbAccelerator at!

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
Bu bağlantı artık yok, ancak burada arşivlenmiş bir sürümünü bulabilirsiniz .
pswg

7

İşte kodum:

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

DÜZENLE: Bu çözümü artık önermiyorum. Hala Windows komut dosyası motorunu kullanmaktan daha iyi bir yöntem yoksa, en azından @ Mehmet'in bellekte düz metin komut dosyası oluşturmak yerine motoru doğrudan çağıran çözümünü kullanın.

Bir kısayol oluşturmak için VBScript kullandık. P / Invoke, COM Interop ve ek DLL'lere ihtiyaç duymaz. Şu şekilde çalışır:

  • CreateShortcut C # yönteminin belirtilen parametreleriyle çalışma zamanında bir VBScript oluşturun
  • Bu VBScript'i geçici bir dosyaya kaydedin
  • Komut dosyasının bitmesini bekleyin
  • Geçici dosyayı silin

Hadi bakalım:

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

İşte size yardımcı olacak yorumlarla birlikte (Test Edilmiş) Uzatma Yöntemi.

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

Ve bir kullanım örneği:

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

1. parm, exe adını belirler (mevcut dizinde bulunur) 2. parm, "Başlangıç" klasörüdür ve 3. parm, kısayol açıklamasıdır.

Bu kodu kullanma örneği

Bağlantının adlandırma kuralı, ne yapacağı konusunda hiçbir belirsizlik bırakmaz. Bağlantıyı test etmek için çift tıklayın.

Son Not: uygulamanın kendisi (hedef) kendisiyle ilişkilendirilmiş bir İKON görüntüsüne sahip olmalıdır. Bağlantı, ICON'u exe içinde kolayca bulabilir. Hedef uygulamanın birden fazla simgesi varsa, bağlantının özelliklerini açabilir ve simgeyi exe'de bulunan diğer herhangi bir simgeye değiştirebilirsiniz.


.GetFolderPath () olmadığını belirten bir hata mesajı alıyorum. XFile.Delete için aynı. Neyi kaçırıyorum?
RalphF

Burada hata mı oluyor? Environment.SpecialFolder.Startup.GetFolderPath ();
John Peters

2

Kısayol oluşturmak için "Windows Komut Dosyası Ana Bilgisayar Nesne Modeli" referansını kullanıyorum.

Proje referanslarına "Windows Komut Dosyası Ana Bilgisayar Nesne Modeli" ekleme

ve belirli bir konuma kısayol oluşturmak için:

    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

Rustam Irzaev'in IWshRuntimeLibrary kullanımıyla verdiği cevaba dayalı bir sarmalayıcı sınıfı oluşturdum.

IWshRuntimeLibrary -> Referanslar -> COM> Windows Komut Dosyası Ana Bilgisayar Nesne Modeli

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

Windows Vista / 7/8/10 için, bunun yerine aracılığıyla bir symlink oluşturabilirsiniz mklink.

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

Seçenek olarak ise, çağrı CreateSymbolicLinkP / Invoke ile.


Bunun bir kısayolla ilgisi yok.
Matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.