且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C#用控制台应用程序创建快捷方式

更新时间:2023-01-31 11:29:26

试试这个:

Try this:
[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
    {
    }
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
    {
    void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
    void GetIDList(out IntPtr ppidl);
    void SetIDList(IntPtr pidl);
    void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
    void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
    void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
    void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
    void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
    void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
    void GetHotkey(out short pwHotkey);
    void SetHotkey(short wHotkey);
    void GetShowCmd(out int piShowCmd);
    void SetShowCmd(int iShowCmd);
    void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
    void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
    void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
    void Resolve(IntPtr hwnd, int fFlags);
    void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
    }
private void CreateLink(string pathToApplication, string description, string linkname = "MyApplication.lnk")
    {
    IShellLink shortcut = (IShellLink)new ShellLink();
    string desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    shortcut.SetDescription(description);
    shortcut.SetPath(pathToApplication);
    System.Runtime.InteropServices.ComTypes.IPersistFile f = (System.Runtime.InteropServices.ComTypes.IPersistFile) shortcut;
    f.Save(Path.Combine(desktop, linkname), false);
    }





我讨厌加价![/ edit]



[edit]I hate markup![/edit]


感谢OriginalGriff。

它工作得很漂亮。



只是增强了CreateLink方法以获得更好的可用性。

Thanks OriginalGriff.
It works beautifully.

Just enhanced the CreateLink method for better usability.
public static void CreateLink(String srcPath, String shortcutPath,
                              String description = null)
{
    // Derive params
    if (description == null)
        description = "Opens " + Path.GetFileNameWithoutExtension(srcPath);
    if (!shortcutPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))
        shortcutPath += ".lnk";

    // Initialize Shortcut
    var link = (IShellLink)new ShellLink();
    link.SetDescription(description);
    link.SetPath(srcPath);
    link.SetWorkingDirectory(Path.GetDirectoryName(srcPath));

    // Save
    var pf = (IPersistFile)link;
    pf.Save(shortcutPath, false);
}