如何在C#中创建一个应用程序快捷方式(.lnk文件)并带有命令行参数

8
我写了一个简单的基于FTP的文件同步程序,其设置可以存储在XML文件中。我希望用户能够快速打开程序并使用不同的配置,因此我设置了该程序可以通过命令行参数读取配置文件的路径。这样就可以根据不同的配置文件在桌面上创建快捷方式。现在我正在尝试添加一个功能,将自动为特定的配置文件创建快捷方式。
我尝试使用这篇文章中的ShellLink.cs例子。我还尝试使用IWshRuntimeLibrary进行操作。我能够创建快捷方式,但是新快捷方式的属性窗口中“目标类型”为空。如果我双击快捷方式,Windows会弹出一个错误窗口,指出无法找到提供的路径中的FooBar.xml文件。所以它似乎没有意识到它应该启动一个应用程序而不是打开一个文件。
现在,如果我打开新快捷方式的属性并更改目标字段中的某些内容,然后再更改回来。例如,删除xml中的x,然后再加回来。点击确定后,快捷方式的图标立即切换为我的应用程序的图标,并在双击时正常工作。
因此,当我手动编辑快捷方式时,它会强制Windows检查快捷方式目标类型是否应为“应用程序”,并将其切换。
那么,如何通过C#创建一个新的快捷方式,并且快捷方式的目标类型为“应用程序”,即使目标路径不以.exe结尾?

我认为这是不可能的。你的FTP程序不是.exe文件吗?事实上,你指定命令行参数应该仍然允许你创建一个具有应用程序目标类型的快捷方式。我曾经发布过一个答案,使用IWshRuntimeLibrary可以正确地工作,但在重新阅读你的问题后删除了它。如果这确实是你想做的事情,我可以再次发布。 - Joepro
1个回答

28

你需要添加一个COM引用到Windows Scripting Host。据我所知,没有本地的.NET方法可以做到这一点。

这个示例将在桌面上创建一个快捷方式。它将使用设置为命令行参数的XML文件启动FTP应用程序。只需更改所需值即可。

        WshShellClass wsh = new WshShellClass();
        IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\shorcut.lnk") as IWshRuntimeLibrary.IWshShortcut;
        shortcut.Arguments = "c:\\app\\settings1.xml";
        shortcut.TargetPath = "c:\\app\\myftp.exe";
        // not sure about what this is for
        shortcut.WindowStyle = 1; 
        shortcut.Description = "my shortcut description";
        shortcut.WorkingDirectory = "c:\\app";
        shortcut.IconLocation = "specify icon location";
        shortcut.Save();

使用这段代码,目标类型会被正确地设置为“应用程序”,并将settings1.xml作为命令行参数启动该应用程序。从你的问题中,我认为这正是你想要做的。然而,我不认为你可以创建一个快捷方式,比如只是一个xml文件,并将目标类型设置为应用程序。

对于 .Net 4.0 及以上版本,请使用以下代码替换第一行(感谢 Millie Smith!):

        WshShell wsh = new WshShell();

6
添加引用 > COM > Windows Script Host 对象模型 - Doug
4
你好 :) 我尝试了这段代码,但在代码的WshShellClass wsh = new WshShellClass();这部分出现了错误。 它说:错误1 Interop类型'IWshRuntimeLibrary.WshShellClass'不能被嵌入。请改用适用的接口。 - ThEpRoGrAmMiNgNoOb
5
@MichayCarpa 在stackoverflow上给出的代码至少对我来说可以编译。对于.NET 4.0及更高版本,第一行应该是WshShell wsh = new WshShell(); - Millie Smith
@Doug,你在VS Studio 2020+中怎么做到这一点?现在没有“添加引用”功能了。 - not_a_generic_user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接