在目录中创build应用程序快捷方式

如何在C#中使用.NET框架创build应用程序快捷方式(.lnk文件)?

结果将是一个.lnk文件到指定的应用程序或URL。

这并不像我喜欢的那么简单,但是在vbAccelerator中有一个很好的类叫ShellLink.cs

此代码使用互操作,但不依赖于WSH。

使用这个类,创build快捷方式的代码是:

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

好,干净。 ( .NET 4.0

 Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object dynamic shell = Activator.CreateInstance(t); try{ var lnk = shell.CreateShortcut("sc.lnk"); try{ lnk.TargetPath = @"C:\something"; lnk.IconLocation = "shell32.dll, 1"; lnk.Save(); }finally{ Marshal.FinalReleaseComObject(lnk); } }finally{ Marshal.FinalReleaseComObject(shell); } 

就是这样,不需要额外的代码。 CreateShortcut甚至可以从文件加载快捷方式,所以像TargetPath这样的属性会返回现有的信息。 快捷方式对象属性 。

对于不支持.NET的dynamictypes的版本,也可以这样做。 ( .NET 3.5

 Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object object shell = Activator.CreateInstance(t); try{ object lnk = t.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, shell, new object[]{"sc.lnk"}); try{ t.InvokeMember("TargetPath", BindingFlags.SetProperty, null, lnk, new object[]{@"C:\whatever"}); t.InvokeMember("IconLocation", BindingFlags.SetProperty, null, lnk, new object[]{"shell32.dll, 5"}); t.InvokeMember("Save", BindingFlags.InvokeMethod, null, lnk, null); }finally{ Marshal.FinalReleaseComObject(lnk); } }finally{ Marshal.FinalReleaseComObject(shell); } 

我发现这样的事情:

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

在sorrowman的文章“url-link-to-desktop”的原始代码

卸载IWshRuntimeLibrary

您还需要导入COM库IWshRuntimeLibrary 。 右键单击你的项目 – >添加引用 – > COM – > IWshRuntimeLibrary – >添加,然后使用下面的代码片段。

 private void createShortcutOnDesktop(String executablePath) { // Create a new instance of WshShellClass WshShell lib = new WshShellClass(); // Create the shortcut IWshRuntimeLibrary.IWshShortcut MyShortcut; // Choose the path for the shortcut string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); MyShortcut = (IWshRuntimeLibrary.IWshShortcut)lib.CreateShortcut(@deskDir+"\\AZ.lnk"); // Where the shortcut should point to //MyShortcut.TargetPath = Application.ExecutablePath; MyShortcut.TargetPath = @executablePath; // Description for the shortcut MyShortcut.Description = "Launch AZ Client"; StreamWriter writer = new StreamWriter(@"D:\AZ\logo.ico"); Properties.Resources.system.Save(writer.BaseStream); writer.Flush(); writer.Close(); // Location for the shortcut's icon MyShortcut.IconLocation = @"D:\AZ\logo.ico"; // Create the shortcut at the given path MyShortcut.Save(); } 

在调查了我发现的所有可能之后,我已经解决了ShellLink问题 :

 //Create new shortcut using (var shellShortcut = new ShellShortcut(newShortcutPath) { Path = path WorkingDirectory = workingDir, Arguments = args, IconPath = iconPath, IconIndex = iconIndex, Description = description, }) { shellShortcut.Save(); } //Read existing shortcut using (var shellShortcut = new ShellShortcut(existingShortcut)) { path = shellShortcut.Path; args = shellShortcut.Arguments; workingDir = shellShortcut.WorkingDirectory; ... } 

除了简单而有效之外,作者(MattiasSjögren,MS MVP)是某种COM / PInvoke / Interop专家,仔细阅读他的代码,我相信它比其他代码更强大。

应该提到的是,快捷方式文件也可以由几个命令行工具创build(这又可以很容易地从C#/ .NET中调用)。 我从来没有尝试过任何一个,但我会从NirCmd开始(NirSoft有像SysInternals一样的质量工具)。

不幸的是,NirCmd无法parsing快捷方式文件(只能创build它们),但为此TZWorks lp似乎有能力。 它甚至可以将其输出格式化为csv。 lnkparsing器看起来也不错(它可以输出HTML和CSV)。

类似于IllidanS4的回答 ,使用Windows Script Hostcertificate是最简单的解决scheme(在Windows 8 64位上testing)。

但是,不要通过代码手动导入COMtypes,只需将COMtypes库作为参考添加即可。 selectReferences->Add Reference...COM->Type Libraries并查找并添加“Windows脚本宿主对象模型”

这会导入您可以访问的命名空间IWshRuntimeLibrary

 WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(LinkPathName); link.TargetPath=TargetPathName; link.Save(); 

信贷去了吉姆Hollenhorst 。