Как вы получаете значки из shell32.dll?

Я хотел бы получить значок дерева для доморощенного приложения. Кто-нибудь знает, как извлечь изображения в виде файлов .icon? Я хотел бы и 16x16 и 32x32, или я просто сделал бы снимок экрана.

12.08.2008 03:26:38
Обратите внимание, что это является нарушением лицензии. «Во время работы программного обеспечения вы можете использовать, но не передавать его значки, изображения, звуки и мультимедиа».
Raymond Chen 29.03.2013 22:45:06
10 ОТВЕТОВ
РЕШЕНИЕ

В Visual Studio выберите «Файл открыт ...», а затем «Файл ...». Затем выберите Shell32.dll. Дерево папок должно быть открыто, и вы найдете значки в папке «Icon».

Чтобы сохранить значок, вы можете щелкнуть правой кнопкой мыши значок в дереве папок и выбрать «Экспорт».

47
6.02.2016 13:42:13
когда я использую это, у меня есть только это дерево папок и все значки в списке, но без предварительного просмотра и заголовки не так полезны (1, 10, 1001, ..). Есть ли способ получить предварительный просмотр, или у меня действительно есть открыть все иконки?
Dominik 23.07.2015 10:46:30
@MickyD Не могу подтвердить - экспорт значков работал для меня как обаяние в VS Community 2017 (15.8.3) - как написано в этом ответе. Меню, возможно, немного изменилось - теперь это «Файл» -> «Открыть» -> «Файл ...». (Я скопировал shell32.dll на свой рабочий стол, чтобы проверить это)
RicoBrassers 20.09.2018 06:11:34
@RicoBrassers хорошо, что смущает, работает сейчас. Должно быть, я сделал что-то глупое. Спасибо, приятель :)
MickyD 20.09.2018 06:41:04

Другой вариант - использовать такой инструмент, как ResourceHacker . Он обрабатывает гораздо больше, чем просто значки. Ура!

20
12.08.2008 04:17:42
Я пытался использовать Resource Hacker, но каждая иконка имеет 12 дубликатов (разных размеров).
HighTechProgramming15 3.01.2017 13:27:42
@ HighTechProgramming15 Разве это не то, что вы хотите?
endolith 19.09.2019 13:17:43

Извлечение ресурсов - это еще один инструмент, который будет рекурсивно находить иконки из множества библиотек DLL, что очень удобно для IMO.

6
6.04.2013 19:51:18
Хотя этот инструмент хорош для извлечения ресурса, у них также есть инструмент IconsExtract nirsoft.net/utils/iconsext.html, который мне кажется более удобным в большинстве случаев, поскольку я могу просматривать значки и просто ссылаться на системный файл, когда я хочу значок во встроенном / связанном документе в Office.
undrline 7.09.2018 18:50:09

Просто откройте DLL с помощью IrfanView и сохраните результат в формате .gif или .jpg.

Я знаю, что этот вопрос старый, но это второй гугл-хит из "Извлечь значок из DLL", я хотел избежать установки чего-либо на моей рабочей станции, и я вспомнил, что я использую IrfanView.

2
22.05.2014 14:58:20

Если вы работаете в Linux, вы можете извлечь иконки из Windows DLL с помощью gExtractWinIcons . Это доступно в Ubuntu и Debian в gextractwiniconsпакете.

Эта статья блога имеет скриншот и краткое объяснение .

1
23.07.2014 08:43:49

Вы можете скачать бесплатную Resource Hacker и затем следовать приведенным ниже инструкциям:

  1. Откройте любой файл DLL, из которого вы хотите найти иконки.
  2. Просмотрите папки, чтобы найти конкретные значки.
  3. В строке меню выберите «действие», а затем «сохранить».
  4. Выберите место для файла .ico.

Ссылка: http://techsultan.com/how-to-extract-icons-from-windows-7/

2
12.11.2014 13:12:38

Мне нужно было извлечь значок # 238 из shell32.dll и я не хотел загружать Visual Studio или Resourcehacker, поэтому я нашел пару сценариев PowerShell из Technet (спасибо Джону Гренфеллу и # https://social.technet.microsoft. ru / Forums / windowsserver / en-US / 16444c7a-ad61-44a7-8c6f-b8d619381a27 / using-icons-in-powershell-scripts? forum = winserverpowershell ), который сделал что-то похожее и создал новый скрипт (ниже) для удовлетворения моих потребностей ,

Я ввел следующие параметры (исходный путь к DLL, имя файла значка назначения и индекс значка в файле DLL):

C: \ Windows \ System32 \ shell32.dll

C: \ Temp \ Restart.ico

238

Я обнаружил, что нужный мне значок индекса был # 238 методом проб и ошибок, временно создав новый ярлык (щелкните правой кнопкой мыши на рабочем столе и выберите «Создать» -> «Ярлык», введите «calc» и дважды нажмите «Enter»). Затем щелкните правой кнопкой мыши новый ярлык и выберите «Свойства», затем нажмите кнопку «Изменить значок» на вкладке «Ярлык». Вставьте путь C: \ Windows \ System32 \ shell32.dll и нажмите ОК. Найдите значок, который вы хотите использовать, и определите его индекс. NB. Индекс № 2 находится под номером 1, а не справа. Значок индекса № 5 находился в верхней части второго столбца на моем компьютере с Windows 7 x64.

Если у кого-то есть лучший метод, который работает аналогично, но получает иконки более высокого качества, мне было бы интересно узнать об этом. Спасибо, Шон.

#Windows PowerShell Code###########################################################################
# http://gallery.technet.microsoft.com/scriptcenter/Icon-Exporter-e372fe70
#
# AUTHOR: John Grenfell
#
###########################################################################

<#
.SYNOPSIS
   Exports an ico and bmp file from a given source to a given destination
.Description
   You need to set the Source and Destination locations. First version of a script, I found other examples but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
   No error checking I'm afraid so make sure your source and destination locations exist!
.EXAMPLE
    .\Icon_Exporter.ps1
.Notes
        Version HISTORY:
        1.1 2012.03.8
#>
Param ( [parameter(Mandatory = $true)][string] $SourceEXEFilePath,
        [parameter(Mandatory = $true)][string] $TargetIconFilePath
)
CLS
#"shell32.dll" 238
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
    $IconIndexNo = Read-Host "Enter the icon index: "
    $Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)    
} Else {
    [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    $image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
    $bitmap = new-object System.Drawing.Bitmap $image
    $bitmap.SetResolution(72,72)
    $icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
}
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
Write-Host "Icon file can be found at $TargetIconFilePath"
9
22.01.2015 14:22:48
Гораздо более полезный ответ, чем остальные.
slashp 18.09.2015 12:51:28
Отличный метод, но он не работает для меня. Я нахожусь на Windows 7x64 на котором сценарий, кажется, подтвержден для работы. Но я получаю TypeNotFoundошибки для System.Drawing.Iconи System.Drawing.Bitmap. Моя первая попытка запустить PS-скрипт, так что, возможно, я что-то не так делаю?
Danny Lo 18.01.2016 01:07:11
Хорошо, мне просто нужно было выполнить Add-Type -AssemblyName System.Drawingсначала.
Danny Lo 18.01.2016 01:12:00

Вот обновленная версия решения выше. Я добавил недостающую сборку, которая была похоронена в ссылке. Новички не поймут этого. Этот образец будет работать без изменений.

    <#
.SYNOPSIS
    Exports an ico and bmp file from a given source to a given destination
.Description
    You need to set the Source and Destination locations. First version of a script, I found other examples 
    but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
.EXAMPLE
    This will run but will nag you for input
    .\Icon_Exporter.ps1
.EXAMPLE
    this will default to shell32.dll automatically for -SourceEXEFilePath
    .\Icon_Exporter.ps1 -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 238
.EXAMPLE
    This will give you a green tree icon (press F5 for windows to refresh Windows explorer)
    .\Icon_Exporter.ps1 -SourceEXEFilePath 'C:/Windows/system32/shell32.dll' -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 41

.Notes
    Based on http://stackoverflow.com/questions/8435/how-do-you-get-the-icons-out-of-shell32-dll Version 1.1 2012.03.8
    New version: Version 1.2 2015.11.20 (Added missing custom assembly and some error checking for novices)
#>
Param ( 
    [parameter(Mandatory = $true)]
    [string] $SourceEXEFilePath = 'C:/Windows/system32/shell32.dll',
    [parameter(Mandatory = $true)]
    [string] $TargetIconFilePath,
    [parameter(Mandatory = $False)]
    [Int32]$IconIndexNo = 0
)

#https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System
{
    public class IconExtractor
    {

     public static Icon Extract(string file, int number, bool largeIcon)
     {
      IntPtr large;
      IntPtr small;
      ExtractIconEx(file, number, out large, out small, 1);
      try
      {
       return Icon.FromHandle(largeIcon ? large : small);
      }
      catch
      {
       return null;
      }

     }
     [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
     private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

    }
}
"@

If  (-not (Test-path -Path $SourceEXEFilePath -ErrorAction SilentlyContinue ) ) {
    Throw "Source file [$SourceEXEFilePath] does not exist!"
}

[String]$TargetIconFilefolder = [System.IO.Path]::GetDirectoryName($TargetIconFilePath) 
If  (-not (Test-path -Path $TargetIconFilefolder -ErrorAction SilentlyContinue ) ) {
    Throw "Target folder [$TargetIconFilefolder] does not exist!"
}

Try {
    If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
        Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing
        $form = New-Object System.Windows.Forms.Form
        $Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)    
    } Else {
        [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        $image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
        $bitmap = new-object System.Drawing.Bitmap $image
        $bitmap.SetResolution(72,72)
        $icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
    }
} Catch {
    Throw "Error extracting ICO file"
}

Try {
    $stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
    $icon.save($stream)
    $stream.close()
} Catch {
    Throw "Error saving ICO file [$TargetIconFilePath]"
}
Write-Host "Icon file can be found at [$TargetIconFilePath]"
3
20.11.2015 19:56:16

Если кто-то ищет простой способ, просто используйте 7zip, чтобы разархивировать shell32.dll и найдите папку .src / ICON /

54
14.06.2016 01:41:03
Да, я очень часто использую функцию 7-Zip «открытый архив».
Niek 26.08.2016 10:48:09
Не получил 7Zip, но попробовал это в WinRAR, и там написано, что нет архива для открытия.
Hashim 18.10.2016 19:04:01
переименуйте в shell32.7z, затем попробуйте открыть его с помощью 7-zip, Peazip или других ваших
ronaldwidha 21.10.2016 17:11:14
Это должен быть принятый ответ, потому что это легко и работает.
Marco7757 28.02.2018 12:41:49

Также доступен этот ресурс, библиотека изображений Visual Studio, которая «может использоваться для создания приложений, которые визуально согласуются с программным обеспечением Microsoft», предположительно в соответствии с лицензией, приведенной внизу. https://www.microsoft.com/en-ca/download/details.aspx?id=35825

1
22.03.2017 22:05:24