Создание ярлыка приложения в каталоге



Как создать ярлык приложения (.lnk file) в C# или с помощью .NET framework?



результат будет a .файл lnk для указанного приложения или URL.

787   6  

6 ответов:

Это не так просто, как хотелось бы, но это отличный класс ShellLink.cs at vbAccelerator

этот код использует взаимодействие, но не полагается на 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();
    }
}

исходный код статья скорбящего "url-ссылка на рабочий стол"

после изучения всех возможностей, которые я нашел, поэтому я остановился на 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;
    ...
}

помимо того, что он прост и эффективен, автор (Маттиас Шегрен, MS MVP) является своего рода гуру COM/PInvoke/Interop, и, просматривая его код, я считаю, что он более надежен, чем альтернативы.

следует отметить, что файлы ярлыков также могут быть созданы несколькими утилитами командной строки (которые, в свою очередь, могут быть легко вызваны из C#/.NET). я никогда не пробовал любой из них, но я бы начал с NirCmd (У NirSoft есть SysInternals-подобные качественные инструменты).

к сожалению NirCmd не может парсить ярлык файлы (создавать их), но для этой цели TZWorks lp кажется, способны. Он даже может форматировать свой вывод в формате csv. lnk-parser выглядит тоже хорошо (он может выводить как HTML, так и CSV).

аналогично ответ IllidanS4, С помощью Windows Script Host оказалось самым простым решением для меня (протестировано на 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();

заслуга Джима Hollenhorst.

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

}

Comments

    Ничего не найдено.