250 lines
10 KiB
C#
250 lines
10 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.IO;
|
|
|
|
internal static class IconMethods
|
|
{
|
|
public enum IconSize
|
|
{
|
|
Large,
|
|
Small
|
|
}
|
|
private static class Internal
|
|
{
|
|
#region Old ExtractAssociatedIcon
|
|
public static HandleRef NullHandleRef = default(HandleRef);
|
|
[DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon", CharSet = CharSet.Auto)]
|
|
public static extern IntPtr IntExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index);
|
|
public static IntPtr ExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index)
|
|
{
|
|
return IntExtractAssociatedIcon(hInst, iconPath, ref index);
|
|
}
|
|
#endregion
|
|
#region New ExtractIconEx
|
|
[DllImport("shell32.dll", EntryPoint = "ExtractIconEx")]
|
|
public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons);
|
|
|
|
#endregion
|
|
}
|
|
|
|
#region Old ExtractAssociatedIcon
|
|
private static Icon __ExtractAssociatedIcon(string filePath, int index)
|
|
{
|
|
Uri uri = null;
|
|
if ((filePath == null))
|
|
{
|
|
throw new ArgumentException("Argument cannot be null.", "filePath");
|
|
}
|
|
try
|
|
{
|
|
uri = new Uri(filePath);
|
|
}
|
|
catch (UriFormatException)
|
|
{
|
|
filePath = Path.GetFullPath(filePath);
|
|
uri = new Uri(filePath);
|
|
}
|
|
//If uri.IsUnc Then
|
|
// Throw New ArgumentException("File path cannot be a UNC path.", "filePath")
|
|
//End If
|
|
if (uri.IsFile | uri.IsUnc)
|
|
{
|
|
if (!File.Exists(filePath))
|
|
{
|
|
throw new FileNotFoundException(filePath);
|
|
}
|
|
System.Text.StringBuilder iconPath = new System.Text.StringBuilder(260);
|
|
iconPath.Append(filePath);
|
|
IntPtr handle = Internal.ExtractAssociatedIcon(Internal.NullHandleRef, iconPath, ref index);
|
|
if ((handle != IntPtr.Zero))
|
|
{
|
|
return Icon.FromHandle(handle);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
#endregion
|
|
#region New ExtractIconEx
|
|
private static Icon __EIEExtractAssociatedIcon(string filePath, int index, IconSize size)
|
|
{
|
|
IntPtr[] phiconLarge = new IntPtr[] { IntPtr.Zero };
|
|
IntPtr[] phiconSmall = new IntPtr[] { IntPtr.Zero };
|
|
|
|
Internal.ExtractIconEx(filePath, index, phiconLarge, phiconSmall, 1);
|
|
|
|
switch (size)
|
|
{
|
|
case IconSize.Large:
|
|
try
|
|
{
|
|
return Icon.FromHandle(phiconLarge[0]);
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
return null;
|
|
}
|
|
case IconSize.Small:
|
|
try
|
|
{
|
|
return Icon.FromHandle(phiconSmall[0]);
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
#endregion
|
|
|
|
public static Icon ExtractFileTypeIcon(string filePath)
|
|
{
|
|
string ext = System.IO.Path.GetExtension(filePath);
|
|
|
|
string iconPath = String.Empty;
|
|
int iconIndex = 0;
|
|
|
|
switch (System.Environment.OSVersion.Platform)
|
|
{
|
|
case PlatformID.MacOSX:
|
|
{
|
|
break;
|
|
}
|
|
case PlatformID.Unix:
|
|
{
|
|
break;
|
|
}
|
|
case PlatformID.Win32NT:
|
|
case PlatformID.Win32S:
|
|
case PlatformID.Win32Windows:
|
|
case PlatformID.WinCE:
|
|
{
|
|
// TODO: Implement something that uses along the lines of MIME info
|
|
// specification
|
|
|
|
/*
|
|
http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
|
<mime-type type="application/msword">
|
|
<comment>MS Word Files</comment>
|
|
<glob pattern="*.doc"/>
|
|
</mime-type>
|
|
</mime-info>
|
|
*/
|
|
|
|
Microsoft.Win32.RegistryKey rkExt = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
|
|
|
|
string className = rkExt.GetValue(String.Empty, String.Empty).ToString();
|
|
Microsoft.Win32.RegistryKey rkClass = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(className);
|
|
if (rkClass != null)
|
|
{
|
|
Microsoft.Win32.RegistryKey rkDefaultIcon = rkClass.OpenSubKey("DefaultIcon");
|
|
if (rkDefaultIcon != null)
|
|
{
|
|
string defaultIconPath = rkDefaultIcon.GetValue(String.Empty, String.Empty).ToString();
|
|
int splitIndex = defaultIconPath.LastIndexOf(',');
|
|
|
|
string defaultIconFileName = defaultIconPath.Substring(0, splitIndex);
|
|
string defaultIconIndex = defaultIconPath.Substring(splitIndex + 1);
|
|
|
|
Int32.TryParse(defaultIconIndex, out iconIndex);
|
|
if (defaultIconFileName.StartsWith("\""))
|
|
{
|
|
defaultIconFileName = defaultIconFileName.Substring(1);
|
|
}
|
|
if (defaultIconFileName.EndsWith("\""))
|
|
{
|
|
defaultIconFileName = defaultIconFileName.Substring(0, defaultIconFileName.Length - 1);
|
|
}
|
|
|
|
iconPath = defaultIconFileName;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
Icon icon = ExtractAssociatedIcon(iconPath, iconIndex);
|
|
return icon;
|
|
}
|
|
|
|
public static Icon ExtractAssociatedIcon(string filePath, int index = 0)
|
|
{
|
|
return ExtractAssociatedIcon(filePath, index, IconSize.Large);
|
|
}
|
|
public static Icon ExtractAssociatedIcon(string filePath, int index, IconSize size)
|
|
{
|
|
Icon icon = null;
|
|
switch (System.Environment.OSVersion.Platform)
|
|
{
|
|
case PlatformID.MacOSX:
|
|
// TODO: Mac OS X support?
|
|
break;
|
|
case PlatformID.Unix:
|
|
break;
|
|
case PlatformID.Win32NT:
|
|
case PlatformID.Win32S:
|
|
case PlatformID.Win32Windows:
|
|
case PlatformID.WinCE:
|
|
icon = __EIEExtractAssociatedIcon(filePath, index, size);
|
|
break;
|
|
case PlatformID.Xbox:
|
|
break;
|
|
}
|
|
return icon;
|
|
}
|
|
|
|
|
|
public static void PopulateSystemIcons(ref System.Windows.Forms.ImageList iml)
|
|
{
|
|
switch (Environment.OSVersion.Platform)
|
|
{
|
|
case PlatformID.MacOSX:
|
|
break;
|
|
case PlatformID.Unix:
|
|
break;
|
|
case PlatformID.Win32NT:
|
|
case PlatformID.Win32S:
|
|
case PlatformID.Win32Windows:
|
|
case PlatformID.WinCE:
|
|
{
|
|
if (iml.ImageSize.Width == 16 && iml.ImageSize.Height == 16)
|
|
{
|
|
Icon iconFile = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Small);
|
|
iml.Images.Add("generic-file", iconFile);
|
|
Icon iconDocument = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Small);
|
|
iml.Images.Add("generic-document", iconDocument);
|
|
Icon iconApplication = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Small);
|
|
iml.Images.Add("generic-application", iconApplication);
|
|
Icon iconFolderClosed = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Small);
|
|
iml.Images.Add("generic-folder-closed", iconFolderClosed);
|
|
Icon iconFolderOpen = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Small);
|
|
iml.Images.Add("generic-folder-open", iconFolderOpen);
|
|
}
|
|
else
|
|
{
|
|
Icon iconFile = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Large);
|
|
iml.Images.Add("generic-file", iconFile);
|
|
Icon iconDocument = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Large);
|
|
iml.Images.Add("generic-document", iconDocument);
|
|
Icon iconApplication = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Large);
|
|
iml.Images.Add("generic-application", iconApplication);
|
|
Icon iconFolderClosed = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Large);
|
|
iml.Images.Add("generic-folder-closed", iconFolderClosed);
|
|
Icon iconFolderOpen = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Large);
|
|
iml.Images.Add("generic-folder-open", iconFolderOpen);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
// throw new PlatformNotSupportedException();
|
|
}
|
|
} |