Как определить индекс значка для рабочего стола и сети для использования в SHGetImageList? - PullRequest
1 голос
/ 28 января 2012

Я могу успешно извлечь значки для дисков, папок и файлов файловой системы, используя API, которые я включил ниже.Дополнительную информацию об импорте DLL и т. Д., Которая помогла мне добиться этого, можно найти здесь .При вызове метода GetExtraLargeIconForFolder я получаю изображение размером 48x48 на значке.

public enum ImageListIconSize : int
{
    Large = 0x0,
    Small = 0x1,
    ExtraLarge = 0x2,
    Jumbo = 0x4
}

private static IImageList GetSystemImageListHandle(ImageListIconSize size)
{
    IImageList iImageList;
    Guid imageListGuid = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
    int ret = SHGetImageList(
        (int)size,
        ref imageListGuid,
        out iImageList
        );
    return iImageList;
}

public static Icon GetExtraLargeIconForFolder(string path)
{
    SHFILEINFO shinfo = new SHFILEINFO();
    IntPtr retVal = SHGetFileInfo(
        path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo),
        (int)(SHGetFileInfoConstants.SHGFI_SYSICONINDEX |
              SHGetFileInfoConstants.SHGFI_ICON));

    int iconIndex = shinfo.iIcon;
    IImageList iImageList =
        (IImageList)GetSystemImageListHandle(ImageListIconSize.ExtraLarge);
    IntPtr hIcon = IntPtr.Zero;
    if (iImageList != null)
    {
        iImageList.GetIcon(iconIndex,
            (int)ImageListDrawItemConstants.ILD_TRANSPARENT, ref hIcon);
    }

    Icon icon = null;
    if (hIcon != IntPtr.Zero)
    {
        icon = Icon.FromHandle(hIcon).Clone() as Icon;
        DestroyIcon(shinfo.hIcon);
    }
    return icon;
}

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

1 Ответ

3 голосов
/ 28 января 2012

Вы почти у цели.Вы по-прежнему используете SHGetFileInfo, но вместо этого вам нужно будет передать SHGFI_PIDL в параметре flags.

Затем вам нужно указать интересующий объект оболочки, передав PIDL вместо пути.Получите PIDL, позвонив SHGetSpecialFolderLocation.Передайте этой подпрограмме значение CSIDL, например, CSIDL_DESKTOP, CSIDL_DRIVES, CSIDL_NETWORK и т. Д.

...