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

本文关键字:应用程序 快捷方式 创建 | 更新日期: 2023-09-27 17:47:22

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

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

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

它并不像我想要的那么简单,但有一个很棒的类叫做 ShellLink.csvb加速器

此代码使用互操作,但不依赖于 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);
}

我发现了这样的东西:

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"中的原始代码

在调查了我在SO上发现的所有可能性后,我选择了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;
    ...
}

除了简单有效之外,作者(Mattias Sjögren,MS MVP)是某种COM/PInvoke/Interop大师,仔细阅读他的代码,我相信它比其他方法更健壮。

应该提到的是,快捷方式文件也可以由多个命令行实用程序创建(反过来可以轻松地从 C#/.NET 调用)。我从未尝试过其中任何一个,但我会从NirCmd开始(NirSoft有类似SysInternals的质量工具)。

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

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

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

功劳归于吉姆·霍伦霍斯特。