- Home /
Question by
alexgv · Dec 21, 2013 at 09:26 PM ·
scripterror
How to use SHGetFileInfo in unity script to get an icon of a file
I try to get icons of files in unity c# script but get an error
ArgumentException: handle System.Drawing.Icon.FromHandle (IntPtr handle) ShellIcon.GetIcon (System.String fileName, UInt32 flags) (at Assets/_SCRIPTS/MAIN.cs:105) ShellIcon.GetSmallIcon (System.String fileName) (at Assets/_SCRIPTS/MAIN.cs:92) MAIN.GetDesktopIcons () (at Assets/_SCRIPTS/MAIN.cs:42) MAIN.Update () (at Assets/_SCRIPTS/MAIN.cs:52)
I tried the code in a Windows forms c# project and it works. What might be wrong here?
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Drawing;
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
} ;
public class MAIN : MonoBehaviour
{
// Use this for initialization
void Start()
{
}
public void GetDesktopIcons()
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string[] fileEntries = Directory.GetFiles(path);
foreach (string fileName in fileEntries)
{
UnityEngine.Debug.Log(fileName);
System.Drawing.Icon lIcon;
lIcon = ShellIcon.GetSmallIcon(fileName);
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyUp(KeyCode.Space))
{
GetDesktopIcons();
}
}
}
public static class ShellIcon
{
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
class Win32
{
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[DllImport("User32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
}
static ShellIcon()
{
}
public static Icon GetSmallIcon(string fileName)
{
return GetIcon(fileName, Win32.SHGFI_SMALLICON);
}
public static Icon GetLargeIcon(string fileName)
{
return GetIcon(fileName, Win32.SHGFI_LARGEICON);
}
private static Icon GetIcon(string fileName, uint flags)
{
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | flags);
Icon icon = (Icon)System.Drawing.Icon.FromHandle(shinfo.hIcon).Clone();
Win32.DestroyIcon(shinfo.hIcon);
return icon;
}
}
Comment
Your answer
Follow this Question
Related Questions
merry fragmas part 2 PlayerNetworkMover Script errors 1 Answer
Why do I get error when using yield? 1 Answer
Unity 5 - Build Shader Error 0 Answers
Click to Teleport 1 Answer