**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
Cool.
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.
ab Vista liegen die Icons in der Imageres.dll. Aber ich werde deinen Helper mal probieren, eventuell kann ich ihn ja mal gebrauchen.
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