在桌面上创build快捷方式C#

我想创build一个快捷方式指向一些EXE文件,在桌面上,使用.NET Framework 3.5,依靠官方的Windows API。 我怎样才能做到这一点?

附加选项,如热键,说明等

首先,Project > Add Reference > COM > 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.SpecialFolders.System) + @"\notepad.exe"; shortcut.Save(); } 

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

应用快捷方式

 private void appShortcutToDesktop(string linkName) { string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url")) { string app = System.Reflection.Assembly.GetExecutingAssembly().Location; writer.WriteLine("[InternetShortcut]"); writer.WriteLine("URL=file:///" + app); writer.WriteLine("IconIndex=0"); string icon = app.Replace('\\', '/'); writer.WriteLine("IconFile=" + icon); writer.Flush(); } } 

也检查这些

例1例2

如果你想使用一些API特定的function,那么你会想要使用IShellLink interface以及IPersistFile interface (通过COM互操作)。

这里有一篇文章详细介绍了你需要做什么,以及示例代码:

下面是一段不依赖于外部COM对象(WSH)的代码,它支持32位和64位程序:

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

您可以使用此ShellLink.cs类来创build快捷方式。

要获取桌面目录,请使用:

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

或使用Environment.SpecialFolder.CommonDesktopDirectory为所有用户创build它。

没有额外的参考:

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

在桌面上创build快捷方式:

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

我只用于我的应用程序:

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

使用vbAccelerator的ShellLink.cs轻松创build快捷方式!

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

编辑:我不推荐这个解决scheme了。 如果还没有比使用Windows脚本引擎更好的方法,至less应该使用@ Mehmet的解决scheme,它直接调用引擎,而不是在内存中创build纯文本脚本。

我们使用VBScript来生成一个快捷方式。 它不需要p / Invoke,COM Interop和附加的DLL。 它是这样工作的:

  • 在运行时使用CreateShortcut C#方法的指定参数生成VBScript
  • 将此VBScript保存在一个临时文件中
  • 等待脚本完成
  • 删除临时文件

干得好:

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

我使用“Windows脚本宿主对象模型”引用来创build快捷方式。

将“Windows脚本宿主对象模型”添加到项目引用

并在特定位置创build快捷方式:

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

我的代码是。

 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, } } 

这是一个(testing)扩展方法,带有评论来帮助你。

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

并使用一个例子:

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

1st parm设置exe名称(在当前目录中find)2nd parm是“Start In”文件夹,3rd parm是快捷键描述。

使用这个代码的例子

链接的命名约定不会含糊不清。 要testing链接,只需双击它。

最后注意:应用程序本身(目标)必须具有与之相关联的ICON图像。 该链接很容易能够在exe中findICON。 如果目标应用程序有多个图标,则可以打开链接的属性,并将该图标更改为在exe中find的任何其他图标。