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


Answers:


62

这不是那么简单,我会很喜欢,但有一个很大的一流的呼叫ShellLink.csvbAccelerator

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

有人在Vista上尝试过ShellLink吗?看起来该代码是在2003
。– blak3r

9
可在Windows 7甚至64位应用程序中使用:)
fparadis2 2011年

1
@Ryan -确保你得到FileIcon.cs文件以及....这两个文件的工作手与手
DJ BURB

1
也许这是一个愚蠢的问题,但是如何将ShellLink添加到项目中?我已经下载了它并将其添加到新文件夹Libraries中。但是在使用(ShellLink Shortcut = new ShellLink())的代码中,找不到ShellLink
Dima Kozyr 2014年

1
我只想指出,这种方法在.NET中有局限性,最终我不得不使用下面的其他答案,其中使用了Dynamics和WSH。该问题似乎与UAC有关: stackoverflow.com/questions/2934420/…因此,问题在于COM界面需要管理员访问权限,而最终用户可能没有此权限。如果您知道他们具有访问权限,那么这不是问题。但是,如果您的用户没有管理员访问权限,则可以使用下面的WSH和Dyanmics方法。
SomeInternetGuy 2014年

52

干净整洁。(.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);
}

2
很干净。如果再次提出问题,这将是最佳答案。
Damien 2014年

这将无法创建名称中包含Unicode字符的快捷方式。在带有.NET 4.0的Win7上进行了测试。COM对象用问号替换Unicode字符,问号在文件名中无效。
Walter Wilfinger 2014年

没什么大不了的,您.Save仍然可以在以后重命名该文件,但是感谢您的通知。
IllidanS4支持Monica 2014年

谢谢,我为此花了很长时间。可以在这里找到更多参数:msdn.microsoft.com/zh-cn/library/xsy6k3ys(v=vs.84).aspx
贾斯汀

谢谢,在发现Shell COM方法受到最终用户的限制后,我最终使用了4.0解决方案。这导致我进入stackoverflow.com/questions/2934420/…,短暂地使我认为我没有解决方案。这个Wsh解决方案表现出色,并且是简单的复制/粘贴。
SomeInternetGuy 2014年

14

我发现了这样的事情:

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链接到桌面”的原始代码


12
给定interop / wsh或反向工程之间的文件格式,我会选择后者。我认为这是一个非常安全的选择,他们不会很快更改格式。
chrisortman

18
Anuraj:您在作弊-这不会创建LNK,而是创建URL文件。
Helge Klein'Aug


这很简单。我不在乎它是.url文件而不是.lnk文件,前提是它最终会做同样的事情。为什么不使用最简单的解决方案?我出于自己的目的对其进行了测试,并且看起来效果很好。我发现真正需要的唯一一行是“ URL =“。
Frank T. Clark

在Windows 10 x64上不起作用:“此Internet快捷方式的目标”“无效...”。我创建了到Web资源的Internet链接,并将其更改为Properties-> Web Document-> Url中的exe路径-它启动了该应用程序。另外,我检查了Windows创建的Internet链接的格式,它是不同的(例如,有一些GUID字段)。因此,这不是有效的格式。PS在这种情况下,最好使用Uri和Uri.AbsoluteUri而不是字符串。
aderesh '16

2

在调查了所有可能性之后,我找到了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)。


1
具有讽刺意味的是,该链接包含文本“ webhost4life”,但该ShellLink链接为404 :-(
noonand'Yon

确实是@noon,似乎该库也没有在Wayback Machine上缓存。幸运的是,我保留了一个副本:onedrive.live.com/…–
Ohad Schneider

1

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

归功于Jim Hollenhorst


1

下载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();

}

我的Windows 8 PC上没有该COM库。
Damien 2014年

@Damien有个叫做Google的东西。哈哈:D开个玩笑,亲爱的,你可以从这里下载它。我也在更新我的问题。感谢您指出它originaldll.com/file/interop.iwshruntimelibrary.dll/20842.html
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.