C#, WPF. Как изменить значок на панели задач ярлыка

Мне нужно создать ярлык с параметрами. Я сделал это так:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;

public void createShortcut()
        {
            IShellLink link = (IShellLink)new ShellLink();

            // setup shortcut information
            link.SetDescription("My shortcut");
            link.SetWorkingDirectory(pathToExeFolder);
            link.SetPath(pathToExe);
            link.SetArguments("param_1");
            link.SetIconLocation(pathToExeFolder + "\\ShortcutIcon.ico", 0);
            // save it
            IPersistFile file = (IPersistFile)link;
            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            file.Save(System.IO.Path.Combine(desktopPath, "MyShortcut.lnk"), false);
        }

[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 Button_Click(object sender, RoutedEventArgs e)
    {
        Icon img = new Icon("Resources/ExeIcon.ico");

        Bitmap bitmap = img.ToBitmap();
        IntPtr hBitmap = bitmap.GetHbitmap();

        ImageSource wpfBitmap =
             Imaging.CreateBitmapSourceFromHBitmap(
                  hBitmap, IntPtr.Zero, Int32Rect.Empty,
                  BitmapSizeOptions.FromEmptyOptions());

        this.Icon = wpfBitmap;
    }

Но это не сработало. Значок на панели задач не изменился. Я также попытался изменить реестр:

HKEY_CLASSES_ROOT
   Applications
       example.exe
           IsHostApp

Это сработало. Когда я запускаю ярлык, на панели задач появляется значок исполняемого файла. Но это работает, только если ярлыки создаются без параметров. Кто-нибудь знает, как это сделать для ярлыков с параметрами?

0 ответов

Другие вопросы по тегам