Laden...

Icons aus Shell32.dll und jetzt auch anderen DLLs

Erstellt von Robertico vor 14 Jahren Letzter Beitrag vor 14 Jahren 8.149 Views
R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren
Icons aus Shell32.dll und jetzt auch anderen DLLs

**Icons aus Shell32.dll 😗*

Wollte mir mal diese Icons zum "anfassen" machen. Habe getestet und es sind 278 Icons in der dll.
Dies habe ich hart verdratet


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;

namespace Programmierhilfe
{
    static class Statics
    {
        static private IntPtr[] largeIcon;
        static private IntPtr[] smallIcon;

        [DllImport("Shell32.dll")]
        public extern static int ExtractIconEx(string libName, int iconIndex, IntPtr[] largeIcon, IntPtr[] smallIcon, int nIcons);

        public static void Init() 
        {
            largeIcon = new IntPtr[278];
            smallIcon = new IntPtr[278];
            ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 278);
        }
        public static Icon GetLargeIcon(int number)
        {
            if (largeIcon == null)
            {
                Init();
            }
            if (number > largeIcon.Length - 1)
            {
                return null;
            }
            return Icon.FromHandle(largeIcon[number]);
        }
        public static Icon GetSmallIcon(int number)
        {
            if (smallIcon == null)
            {
                Init();
            }
            if (number > smallIcon.Length-1)
            {
                return null;
            }
            return Icon.FromHandle(smallIcon[number]);
        }
    }
}


Will man eins haben, so wird die Init() ausgeführt und alle sind da.(zumindest die Handles)

Man holt sich ein Icon mit der Nummer:

            Icon myIcon = Statics.GetLargeIcon(nummer); // oder small
            Image bild = new Bitmap(myIcon.ToBitmap(), myIcon.Width, myIcon.Height);

Im angehängten Bild sind nicht alle sichtbar, aber im Projekt, das auch angehängt ist.

Gruß Robert

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren
J
237 Beiträge seit 2008
vor 14 Jahren

Cool.

  1. Könntest die Klasse ja ShellIconHelper nennen.
  2. Eine Enumeration ShellIcon wäre eine enorme Erleichterung.
    Dann könnte man schreiben:

Icon myIcon = ShellIconHelper.GetLargeIcon(ShellIcon.FontFolder);

Das wäre lesbarer als 38.
PS: Vllt. mache ich das heute noch, wenn ich Zeit finde.
EDIT: Habe leider keine Zeit. 🙁

Grüße, JasonDelife.

Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.

906 Beiträge seit 2005
vor 14 Jahren

ab Vista liegen die Icons in der Imageres.dll. Aber ich werde deinen Helper mal probieren, eventuell kann ich ihn ja mal gebrauchen.

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren

Danke für eure Anregungen.

In der Imageres.dll liegen 185 Icons.
Denke mir, dass hier die Nummern einfacher sind als 100te Namen.

Habe jetzt die Klasse umgebaut, sodass man sich beliebige DLLs auslesen kann.
€dit: habe gerade festgestellt, dass man auch aus einer .exe lesen kann.

Änderungen:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;

namespace Programmierhilfe
{
    class ShellIconHelper 
    {
        private IntPtr[] largeIcon;
        private IntPtr[] smallIcon;

        [DllImport("Shell32.dll")]
        public extern static int ExtractIconEx(string libName, int iconIndex, IntPtr[] largeIcon, IntPtr[] smallIcon, int nIcons);

        /// <summary>
        /// AnzahlIcons Property
        /// </summary>
        private int anzahlIcons = 0;
        public int AnzahlIcons
        {
            get { return anzahlIcons; }
        }    

        public ShellIconHelper(string dllName) 
        {
            anzahlIcons = ExtractIconEx(dllName, -1, largeIcon, smallIcon, int.MaxValue);
            largeIcon = new IntPtr[anzahlIcons];
            smallIcon = new IntPtr[anzahlIcons];
            ExtractIconEx(dllName, 0, largeIcon, smallIcon, anzahlIcons);
        }
        public Icon GetLargeIcon(int number)
        {
            if (number > anzahlIcons - 1)
            {
                return null;
            }
            return Icon.FromHandle(largeIcon[number]);
        }
        public Icon GetSmallIcon(int number)
        {
            if (number > anzahlIcons - 1)
            {
                return null;
            }
            return Icon.FromHandle(smallIcon[number]);
        }
    }
}

und.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Programmierhilfe
{
    public partial class Form1 : Form
    {
        ShellIconHelper Imagesdll;
        public Form1()
        {
            InitializeComponent();
            // Hier Name der dll
            Imagesdll = new ShellIconHelper("Imageres.dll");
            boxes = new PictBox[Imagesdll.AnzahlIcons];
        }
        PictBox[] boxes;
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < Imagesdll.AnzahlIcons; i++)
            {
                boxes[i] = new PictBox(i);
                boxes[i].Set(i,Imagesdll.GetLargeIcon(i),Imagesdll.GetSmallIcon(i));

                splitContainer1.Panel2.Controls.Add(boxes[i]);
            }
            Size = new Size(1125, 919);
        }
        private void splitContainer1_Panel2_Resize(object sender, EventArgs e)
        {
            if (boxes == null || boxes[0] == null)
            {
                return;
            }
            int breite = splitContainer1.Panel2.Width;
            int höhe = splitContainer1.Panel2.Height;
            int anzHor = breite / boxes[0].Width;
            int anzVert = boxes.Length / anzHor;
            int zeile = 0;
            int spalte = 0;
            for (int i = 0; i < boxes.Length; i++)
            {
                zeile = i / anzHor;
                spalte = i - zeile * anzHor;
                boxes[i].Location = new Point(spalte * boxes[i].Width, zeile * boxes[i].Height);
            }
        }
    }
}


Gruß Robert

PS: geht natürlich komfortabler, aber für jemanden der programmiert dürfte das ja kein Problem sein 😉

Anhang: alle dlls(nicht unbedingt auf jedem PC), in denen Icons sind aus dem Verzeichnis System 32.

Name \t Anzahl \t Path