如何使用C#或使用.NET框架创建应用程序快捷方式(.lnk文件)?
结果将是指向指定应用程序或URL的.lnk文件。
如何使用C#或使用.NET框架创建应用程序快捷方式(.lnk文件)?
结果将是指向指定应用程序或URL的.lnk文件。
Answers:
这不是那么简单,我会很喜欢,但有一个很大的一流的呼叫ShellLink.cs在 vbAccelerator
此代码使用互操作,但不依赖WSH。
使用此类,创建快捷方式的代码为:
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版本,这种方式也是可行的。(.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);
}
.Save
仍然可以在以后重命名该文件,但是感谢您的通知。
我发现了这样的事情:
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();
}
}
在调查了所有可能性之后,我找到了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专家,仔细阅读他的代码,我相信它比其他方法更强大。
应该提到的是,快捷方式文件也可以由几个命令行实用程序创建(依次可以从C#/。NET轻松调用)。我从未尝试过其中任何一个,但我将从NirCmd开始(NirSoft具有类似于SysInternals的质量工具)开始。
不幸的是,NirCmd无法解析快捷方式文件(只能创建它们),但为此,TZWorks lp似乎能够。它甚至可以将其输出格式化为csv。lnk-parser也看起来不错(它可以同时输出HTML和CSV)。
与IllidanS4的答案类似,使用Windows脚本宿主被证明对我来说是最简单的解决方案(在Windows 8 64位上测试)。
但是,与其通过代码手动导入COM类型,不如仅将COM类型库添加为引用会更容易。选择References->Add Reference...
,COM->Type Libraries
然后找到并添加“ Windows脚本宿主对象模型”。
这将导入命名空间IWshRuntimeLibrary
,您可以从该命名空间访问:
WshShell shell = new WshShell();
IWshShortcut link = (IWshShortcut)shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();
您还需要导入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();
}