Найдите цель для ярлыка .lnk в Windows 10, используя C# - PullRequest
0 голосов
/ 21 июня 2020

Я использую sh, чтобы найти цель ярлыка (файл .lnk, а не символическую ссылку) в Windows 10, используя C#.

Я искал несколько часов и нашел множество методов для при этом запомнились два комментария о том, что ярлыки в Windows 10 несколько отличаются. Во-вторых, это сложнее, чем кажется. Ни один из методов, которые я пробовал, не работает. Я сослался на все необходимые COM-объекты.

Они компилируются (полные программы делают), но не производят вывода, за исключением идеи Shell32, которая имеет ошибку разрешения.

Примеры что я пробовал (фрагменты)

        IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
        IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath);
        return shortcut.TargetPath;
        // supposed to reference an existing shortcut, but no output
        
        ---or---
                    
        dynamic shortcut;
        dynamic windowsShell;
        Type shellObjectType = Type.GetTypeFromProgID("WScript.Shell");
        windowsShell = Activator.CreateInstance(shellObjectType);
        shortcut = windowsShell.CreateShortcut(LinkName);
        string Properfile = shortcut.TargetPath;
        // Release the COM objects
        shortcut = null;
        windowsShell = null;
        return Properfile;
        //no output

        
        ---or---
        
        string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
        string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);

        Shell shell = new Shell();
        Folder folder = shell.NameSpace(pathOnly);
        FolderItem folderItem = folder.ParseName(filenameOnly);
        if (folderItem != null)
        {
            Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
            return link.Path;
        }
        // permission error
        

Это фрагменты, но передают идею ввода, процедуры и результата.

Единственное, что я нашел, - это документ Microsoft на структура файла .lnk. Я видел решения, которые анализируют их (более старые версии), но мне бы очень хотелось остаться с современным API.

Итак, я резюмировал (да, написание Aus), что я хочу, что я пробовал и как код не выполнен.

Для сравнения, цель состоит в том, чтобы иметь окно с ярлыками, но, похоже, мне нужно go вернуться к исполняемому файлу, чтобы получить значки разного размера в ListView.

1 Ответ

0 голосов
/ 03 июля 2020

Вы можете примерить что-то вроде этого:

    public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation)
    {
        string shortcutLocation = System.IO.Path.Combine(shortcutPath, shortcutName + ".lnk");
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);

        shortcut.Description = "Discription";   // The description of the shortcut
        shortcut.IconLocation = "Path";// The icon of the shortcut
        shortcut.TargetPath = targetFileLocation;   // The path of the file that will launch when the shortcut is run
        shortcut.Save();   // Save the shortcut
    }

И вот как вы бы это использовали:

CreateShortcut("Name", PathToDesktop, InstallPathwitheExtention");
...