Domanda

Mi piacerebbe ottenere l'icona dell'albero da utilizzare per un'app sviluppata internamente.Qualcuno sa come estrarre le immagini come file .icon?Vorrei sia 16x16 che 32x32, oppure farei semplicemente una cattura dello schermo.

È stato utile?

Soluzione

In Visual Studio, seleziona "File Apri...", quindi "File...".Quindi scegli Shell32.dll.Dovrebbe essere aperto un albero delle cartelle e troverai le icone nella cartella "Icone".

Per salvare un'icona, puoi fare clic con il pulsante destro del mouse sull'icona nell'albero delle cartelle e scegliere "Esporta".

Altri suggerimenti

Se qualcuno cerca un modo semplice, usa 7zip per decomprimere shell32.dll e cercare la cartella .src/ICON/

Un'altra opzione è utilizzare uno strumento come ResourceHacker.Gestisce molto più che semplici icone.Saluti!

Avevo bisogno di estrarre l'icona n. 238 da shell32.dll e non volevo scaricare Visual Studio o Resourcehacker, quindi ho trovato un paio di script PowerShell da Technet (grazie John Grenfell e a #https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell) che ha fatto qualcosa di simile e ha creato un nuovo script (sotto) per soddisfare le mie esigenze.

I parametri che ho inserito erano (il percorso della DLL di origine, il nome del file dell'icona di destinazione e l'indice dell'icona all'interno del file DLL):

C:\Windows\System32\shell32.dll

C: emp estart.ico

238

Ho scoperto che l'indice delle icone di cui avevo bisogno era il n. 238 per tentativi ed errori creando temporaneamente un nuovo collegamento (fai clic con il pulsante destro del mouse sul desktop e seleziona Nuovo --> Collegamento e digita calc e premi Invio due volte).Quindi fare clic con il pulsante destro del mouse sul nuovo collegamento e selezionare Proprietà, quindi fare clic sul pulsante "Cambia icona" nella scheda Collegamento.Incolla il percorso C:\Windows\System32\shell32.dll e fai clic su OK.Trova l'icona che desideri utilizzare e calcola il suo indice.NB:L'indice n. 2 è sotto il n. 1 e non alla sua destra.L'indice delle icone n. 5 era in cima alla colonna due sul mio computer Windows 7 x64.

Se qualcuno ha un metodo migliore che funzioni in modo simile ma ottenga icone di qualità superiore, sarei interessato a saperlo.Grazie, Shaun.

#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"

Estratto delle risorse è un altro strumento che troverà ricorsivamente le icone di molte DLL, IMO molto utile.

Ecco una versione aggiornata di una soluzione di cui sopra.Ho aggiunto un assembly mancante sepolto in un collegamento.I principianti non lo capiranno.Questo esempio verrà eseguito senza modifiche.

    <#
.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]"

Basta aprire la DLL con IrfanView e salvare il risultato come .gif o .jpg.

So che questa domanda è vecchia, ma è il secondo colpo di Google da "estrai icona da dll", volevo evitare di installare qualcosa sulla mia workstation e mi sono ricordato di usare IrfanView.

È possibile scaricare software gratuito Hacker di risorse e poi seguire le istruzioni seguenti:

  1. Apri qualsiasi file dll da cui desideri trovare le icone.
  2. Sfoglia le cartelle per trovare icone specifiche.
  3. Dalla barra dei menu, seleziona "azione" e quindi "salva".
  4. Seleziona la destinazione per il file .ico.

Riferimento : http://techsultan.com/how-to-extract-icons-from-windows-7/

Se utilizzi Linux, puoi estrarre le icone da una DLL di Windows con gExtractWinIcons.È disponibile in Ubuntu e Debian nella versione gextractwinicons pacchetto.

Questo articolo del blog ha un screenshot e breve spiegazione.

È disponibile anche questa risorsa, la Visual Studio Image Library, che "può essere utilizzata per creare applicazioni che sembrino visivamente coerenti con il software Microsoft", presumibilmente soggette alla licenza riportata in basso.https://www.microsoft.com/en-ca/download/details.aspx?id=35825

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top