C# 如何在.NET/C中以编程方式创建应用程序的快捷方式(.lnk)并将其添加到启动文件夹#

C# 如何在.NET/C中以编程方式创建应用程序的快捷方式(.lnk)并将其添加到启动文件夹#,c#,.net,windows-vista,installation,uac,C#,.net,Windows Vista,Installation,Uac,我的应用程序将具有每台计算机(而不是每用户)的启动快捷方式。我可以在安装过程中创建快捷方式,没有问题。我的问题出现在用户稍后将其删除,然后尝试重新启用时。换句话说,他们关闭Runnstartup(删除启动墨迹),然后在稍后的时间决定是否希望它在启动时运行,以便返回首选项并重新启用 显然,对于.NET来说,这是一个非常常见的抱怨,即没有一种本地方法来创建快捷方式。但是,还没有找到一个很好的解决方案 我发现/考虑过的解决方案: 而不是创建一个快捷方式。复制一个就行了。这可能是一个很好的解决方案。我

我的应用程序将具有每台计算机(而不是每用户)的启动快捷方式。我可以在安装过程中创建快捷方式,没有问题。我的问题出现在用户稍后将其删除,然后尝试重新启用时。换句话说,他们关闭Runnstartup(删除启动墨迹),然后在稍后的时间决定是否希望它在启动时运行,以便返回首选项并重新启用

显然,对于.NET来说,这是一个非常常见的抱怨,即没有一种本地方法来创建快捷方式。但是,还没有找到一个很好的解决方案

我发现/考虑过的解决方案:

  • 而不是创建一个快捷方式。复制一个就行了。这可能是一个很好的解决方案。我不能指望有一个开始菜单链接。但是,我想我可能会创建一个并将其保存在程序目录中。。。这将问题转移到我的安装程序上,我必须使用安装时指定的适当路径创建快捷方式

  • 按原样操作并使用COM包装器对象。我想避免使用COM。它也是在2003年写的。所以,我不确定它对vista的支持程度。我想试一试,但手边没有vista框

  • 改为使用注册表。这就是我目前的做法。。。但在Vista上遇到了一些问题。似乎大家都认为启动菜单快捷键是实现这一点的正确方法,所以这就是我的目标

此外,我还必须处理一个普通用户(不是管理员)试图更改此首选项的情况。在这种情况下,我需要优雅地失败,或者在vista的情况下,允许用户输入管理员密码以获得管理员安全令牌。一个已经正确考虑到这个问题的答案将是令人敬畏的。 如果这个话题已经涉及到了,我很抱歉。我在发帖前到处找了找


更新:复制安装程序创建的快捷方式是最佳解决方案。完成后我会发布代码。。。遇到了一些障碍,a)Environment.GetSpecialFolder没有对已解决的StartMenu的引用。。。但是,现在我要处理的是提升将文件复制到正确位置的权限。我为此主题创建了一个新的stackoverflow问题:

您可以在应用程序的program files文件夹中安装应用程序的快捷方式,然后根据需要复制该.lnk文件。

我已经使用此解决方案一段时间了,看起来效果不错


正如Joel所建议的,正确的解决方案是在安装时在program files文件夹中安装快捷方式,然后将.lnk复制到startup文件夹。尝试创建快捷方式更加困难

以下代码执行以下操作:

  • 它为您获取所有用户启动文件夹的路径。Environment.GetSpecialFolder相当有限,没有对此文件夹的引用,因此需要进行系统调用
  • 具有复制和删除快捷方式的方法
最后,我还想确保在vista上对其进行优雅处理,如果运行应用程序的用户是普通用户,则会提示他们输入凭据。我在这里写了一篇关于这个主题的帖子,如果这对你很重要的话,请在这里查看。


我已经完成了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Shell32;
using IWshRuntimeLibrary;
using System.IO;

namespace CMS.data
{
    public class overall
    {
        public static void place_shortcut_on_desktop()
        {
            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\YourName.lnk";
            string shortcutto = System.Reflection.Assembly.GetExecutingAssembly().Location;

            var wsh = new IWshShell_Class();
            IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(desktopPath) as IWshRuntimeLibrary.IWshShortcut;
            shortcut.TargetPath = shortcutto;
            shortcut.WorkingDirectory = Directory.GetParent(shortcutto).FullName;
            shortcut.Save();
        }
    }//class overall
}
记住“工作目录”,否则可能会出现问题

你也可以这样添加图标,但在我的情况下,我不需要它


这是我在stack overflow上的第一个答案,所以感谢会非常有帮助

IShellLink在Vista中运行良好。AFAIK是创建/解析快捷方式的最佳方式。您也可以通过与IWshRuntimeLibrary.dll的互操作关联来实现这一点,但这意味着您最终可能会提供一个额外的互操作程序集。我将此解决方案与非常感谢结合在一起,在2017年看到这一点,仍然很有帮助
        // Quit the application if the per user setting for RunOnStartup is false.
            if (args != null && args.Length > 0 && args[0].Contains("startup"))
            {
                if (Settings1.Default.RunOnStartup == false)
                {
                    Application.Exit();
                }
            }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Shell32;
using IWshRuntimeLibrary;
using System.IO;

namespace CMS.data
{
    public class overall
    {
        public static void place_shortcut_on_desktop()
        {
            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\YourName.lnk";
            string shortcutto = System.Reflection.Assembly.GetExecutingAssembly().Location;

            var wsh = new IWshShell_Class();
            IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(desktopPath) as IWshRuntimeLibrary.IWshShortcut;
            shortcut.TargetPath = shortcutto;
            shortcut.WorkingDirectory = Directory.GetParent(shortcutto).FullName;
            shortcut.Save();
        }
    }//class overall
}