-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIconExtractor.cs
More file actions
132 lines (100 loc) · 3.63 KB
/
IconExtractor.cs
File metadata and controls
132 lines (100 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
Copyright (C) 2016 Marko Graf
*/
using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
namespace KeeSAPLogon
{
class IconExtractor
{
public enum IconSource
{
CommonPropSheet,
Devices,
IE,
Network,
Shell,
WinImg
}
private const string IconSrcCommonPropSheet = "%windir%\\system32\\compstui.dll";
private const string IconSrcDevice = "%windir%\\system32\\ddores.dll";
private const string IconSrcIE = "%windir%\\system32\\ieframe.dll";
private const string IconSrcNetwork = "%windir%\\system32\\netshell.dll";
private const string IconSrcShell = "%windir%\\system32\\shell32.dll";
private const string IconSrcWinImg = "%windir%\\system32\\imageres.dll";
//---------------------------------------------------------------------------------------------------
// Public Static Methods
//---------------------------------------------------------------------------------------------------
public static Icon GetOpenFolderIcon()
{
Icon i = IconExtractor.Extract(GetSourceLocation(IconSource.Shell), 4, true);
if (i == null)
{
return SystemIcons.Application;
}
return i;
}
public static Icon GetSettingsIcon()
{
Icon i = IconExtractor.Extract(GetSourceLocation(IconSource.Shell), 21, true);
if (i == null)
{
return SystemIcons.Application;
}
return i;
}
private 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);
private static string GetSourceLocation(IconSource source)
{
string fileLoc = GetIconSource(source);
if (fileLoc == null)
{
return null;
}
fileLoc = Environment.ExpandEnvironmentVariables(fileLoc);
FileInfo fileInfo = new FileInfo(fileLoc);
if (!fileInfo.Exists)
{
return null;
}
return fileLoc;
}
private static string GetIconSource(IconSource source)
{
switch (source)
{
case IconSource.CommonPropSheet:
return IconSrcCommonPropSheet;
case IconSource.Devices:
return IconSrcDevice;
case IconSource.IE:
return IconSrcIE;
case IconSource.Network:
return IconSrcNetwork;
case IconSource.Shell:
return IconSrcShell;
case IconSource.WinImg:
return IconSrcWinImg;
default:
return null;
}
}
}
}