SHFILEINFO를 사용하여 파일 아이콘 가져 오기

무르 하프 수 슬리

나는 많은 크기의 주어진 경로의 아이콘을 얻는 ac # 라이브러리를 찾고 있었는데, 마침내 필요한 클래스를 정확히 얻었을 때 문제가 있습니다.

이 메소드는 주어진 경로의 아이콘을 가져옵니다.

public static BitmapSource GetIcon(string FileName, bool small, bool checkDisk, bool addOverlay)
    {
        SHFILEINFO shinfo = new SHFILEINFO();

        uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
        uint SHGFI_LINKOVERLAY = 0x000008000;

        uint flags;
        if (small)
        {
            flags = SHGFI_ICON | SHGFI_SMALLICON;
        }
        else
        {
            flags = SHGFI_ICON | SHGFI_LARGEICON;
        }
        if (!checkDisk)
            flags |= SHGFI_USEFILEATTRIBUTES;
        if (addOverlay)
            flags |= SHGFI_LINKOVERLAY;

        var res = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), flags);
        if (res == 0)
        {
            throw (new System.IO.FileNotFoundException());
        }

        var ico = System.Drawing.Icon.FromHandle(shinfo.hIcon); //**Here**

        var bs = BitmapFromIcon(ico);
        ico.Dispose();
        bs.Freeze();
        DestroyIcon(shinfo.hIcon);

        //   CloseHandle(shinfo.hIcon);  it always give exception
        return bs;

    }

public static extern Boolean CloseHandle(IntPtr handle);

이 질문에있는 이전 코드는 예상 대로 작동 하지만 디렉토리의 파일 경로 아이콘을 성공적으로 가져온 후에 는 다음 줄에 예외가 발생합니다.
var ico = System.Drawing.Icon.FromHandle(shinfo.hIcon);

An exception of type 'System.IO.FileNotFoundException' occurred in WPF_REMOTE.exe but was not handled in user code

Additional information: Unable to find the specified file.

그렇다면 왜 이런 일이 발생합니까? 업데이트 : 나는 유니 코드 문자가 포함 된 경로가 있었기 때문에이 일어난 것을 발견하고 난 아직도 그림 방식을 변경할 수 있습니다, 대신 SHFILEINFOW를 사용할 필요 SHFILEINFOSHFILEINFOW

줄에 대한 또 다른 질문은 CloseHandle(shinfo.hIcon);항상 예외를 제공합니다.

An exception of type 'System.Runtime.InteropServices.SEHException' occurred in WPF_REMOTE.exe but was not handled in user code

Additional information: External component has thrown an exception.

왜 작동하지 않는지 궁금합니다! 그리고 방법이 이미 그것없이 작동한다면 왜 그것을 사용해야합니까?

또한이 수업에서 사용할 수있는 개선 사항이 있으면 미리 감사드립니다.

무르 하프 수 슬리

일부 코드를 편집 한 후이 라이브러리에서 아이콘을 쉽게 가져올 수 있습니다. 제 경우에는 아이콘이 byte []로 필요했습니다.

public class IconHelper
{
    // Constants that we need in the function call

    private const int SHGFI_ICON = 0x100;

    private const int SHGFI_SMALLICON = 0x1;

    private const int SHGFI_LARGEICON = 0x0;

    private const int SHIL_JUMBO = 0x4;
    private const int SHIL_EXTRALARGE = 0x2;

    // This structure will contain information about the file

    public struct SHFILEINFO
    {

        // Handle to the icon representing the file

        public IntPtr hIcon;

        // Index of the icon within the image list

        public int iIcon;

        // Various attributes of the file

        public uint dwAttributes;

        // Path to the file

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

        public string szDisplayName;

        // File type

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]

        public string szTypeName;

    };

    [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
    public static extern Boolean CloseHandle(IntPtr handle);

    private struct IMAGELISTDRAWPARAMS
    {
        public int cbSize;
        public IntPtr himl;
        public int i;
        public IntPtr hdcDst;
        public int x;
        public int y;
        public int cx;
        public int cy;
        public int xBitmap;        // x offest from the upperleft of bitmap
        public int yBitmap;        // y offset from the upperleft of bitmap
        public int rgbBk;
        public int rgbFg;
        public int fStyle;
        public int dwRop;
        public int fState;
        public int Frame;
        public int crEffect;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct IMAGEINFO
    {
        public IntPtr hbmImage;
        public IntPtr hbmMask;
        public int Unused1;
        public int Unused2;
        public Rect rcImage;
    }
    [DllImport("shell32.dll", EntryPoint = "#727")]
    private extern static int SHGetImageList(
        int iImageList,
        ref Guid riid,
        out IImageList ppv
        );

    // The signature of SHGetFileInfo (located in Shell32.dll)
    [DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
    public static extern int SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

    [DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
    public static extern int SHGetFileInfo(IntPtr pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

    [DllImport("shell32.dll", SetLastError = true)]
    static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, Int32 nFolder,
             ref IntPtr ppidl);

    [DllImport("user32")]
    public static extern int DestroyIcon(IntPtr hIcon);

    public struct pair
    {
        public System.Drawing.Icon icon { get; set; }
        public IntPtr iconHandleToDestroy { set; get; }

    }


    private static byte[] ByteFromIcon(System.Drawing.Icon ic)
    {
        var icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(ic.Handle,
                                                System.Windows.Int32Rect.Empty,
                                                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        icon.Freeze();
        byte[] data;
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(icon));
        using (MemoryStream ms = new MemoryStream())
        {
            encoder.Save(ms);
            data = ms.ToArray();
        }
        return data;
    }
private static byte[] GetSmallIcon(string FileName, IconSize iconSize)
    {
        SHFILEINFO shinfo = new SHFILEINFO();
        uint flags;
        if (iconSize == IconSize.Small)
        {
            flags = SHGFI_ICON | SHGFI_SMALLICON;
        }
        else
        {
            flags = SHGFI_ICON | SHGFI_LARGEICON;
        }
        var res = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), flags);
        if (res == 0)
        {
            throw (new System.IO.FileNotFoundException());
        }
        var ico = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shinfo.hIcon);
        var bs = ByteFromIcon(ico);
        ico.Dispose();
        DestroyIcon(shinfo.hIcon);
        return bs;
    }

    private static byte[] GetLargeIcon(string FileName)
    {
        SHFILEINFO shinfo = new SHFILEINFO();
        uint SHGFI_SYSICONINDEX = 0x4000;
        int FILE_ATTRIBUTE_NORMAL = 0x80;
        uint flags;
        flags = SHGFI_SYSICONINDEX;
        var res = SHGetFileInfo(FileName, FILE_ATTRIBUTE_NORMAL, ref shinfo, Marshal.SizeOf(shinfo), flags);
        if (res == 0)
        {
            throw (new System.IO.FileNotFoundException());
        }
        var iconIndex = shinfo.iIcon;
        Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
        IImageList iml;
        int size = SHIL_EXTRALARGE;
        var hres = SHGetImageList(size, ref iidImageList, out  iml); // writes iml
        IntPtr hIcon = IntPtr.Zero;
        int ILD_TRANSPARENT = 1;
        hres = iml.GetIcon(iconIndex, ILD_TRANSPARENT, ref hIcon);
        var ico = System.Drawing.Icon.FromHandle(hIcon);
        var bs = ByteFromIcon(ico);
        ico.Dispose();
        DestroyIcon(hIcon);
        return bs;
    }

}

아이콘에 대해 4 가지 크기를 얻을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

.bat를 사용하여 파일 이름 가져 오기-Windows 10

분류에서Dev

SimpleHTMLDOM 파서를 사용하여 iTunes에서 앱 아이콘 이미지 가져 오기

분류에서Dev

가져 오기 도구를 사용하여 여러 파일에서 데이터 가져 오기

분류에서Dev

스레드를 사용하여 파일에서 이메일 가져 오기

분류에서Dev

Google 드라이브 API를 사용하여 파일 크기 가져 오기

분류에서Dev

PHP를 사용하여 외부 XML 파일에서 데이터 가져 오기

분류에서Dev

PHP를 사용하여 외부 XML 파일에서 데이터 가져 오기

분류에서Dev

셸 스크립트를 사용하여 파일 이름 만 가져 오기

분류에서Dev

Javascript를 사용하여 JSON 파일에서 HTML로 데이터 가져 오기

분류에서Dev

FileSystemWatcher를 사용하여 파일 사용 예외 가져 오기

분류에서Dev

가져 오기 범위를 사용하여 전체 행이 아닌 단일 셀로 콘텐츠를 가져 오는 방법은 무엇입니까?

분류에서Dev

Python pdftables를 사용하여 pdf에서 테이블 데이터를 가져 오는 NotImplementedError 파일 가져 오기

분류에서Dev

NodeJS를 사용하여 Google 드라이브 API에서 특정 파일의 콘텐츠 가져 오기

분류에서Dev

파일 공급자를 사용하여 sdcard에 저장된 이미지의 콘텐츠 URI 가져 오기

분류에서Dev

일부 .lnk 파일을 시작하고 Process.Start 및 SHGetFileInfo ()를 사용하여 아이콘을 가져올 때 오류가 발생했습니다.

분류에서Dev

Python 파일 선택기를 사용하여 CSV 파일을 데이터 프레임으로 가져 오기

분류에서Dev

OSError 가져 오기 : pyarrow ParquetDataset을 사용하여 파일이 아닌 경로를 전달했습니다.

분류에서Dev

python + pyElftools를 사용하여 (avr) elf 파일에서 메모리 레이아웃 가져 오기

분류에서Dev

Python pathlib를 사용하여 파일 이름없이 파일의 절대 경로 가져 오기

분류에서Dev

와일드 카드를 사용하여 파일에서 Blob 콘텐츠 가져 오기

분류에서Dev

루프를 사용하여 많은 파일 가져 오기

분류에서Dev

Cypress를 사용하여 Excel 파일 업로드 / 가져 오기

분류에서Dev

VBA를 사용하여 Access로 Excel 파일 가져 오기

분류에서Dev

gem 'postgres-copy'를 사용하여 csv 파일 가져 오기

분류에서Dev

FDBatchMove를 사용하여 CSV 파일을 FDTableTask로 가져 오기

분류에서Dev

cbdocloader를 사용하여 JSON 파일을 Couchbase로 가져 오기

분류에서Dev

WebClient를 사용하여 인트라넷 파일 가져 오기

분류에서Dev

Groovy를 사용하여 파일에서 단어 가져 오기

분류에서Dev

가져 오기 내보내기 마법사를 사용하여 DAT 파일 내용을 SQL Server 테이블로 가져 오기-오류

Related 관련 기사

  1. 1

    .bat를 사용하여 파일 이름 가져 오기-Windows 10

  2. 2

    SimpleHTMLDOM 파서를 사용하여 iTunes에서 앱 아이콘 이미지 가져 오기

  3. 3

    가져 오기 도구를 사용하여 여러 파일에서 데이터 가져 오기

  4. 4

    스레드를 사용하여 파일에서 이메일 가져 오기

  5. 5

    Google 드라이브 API를 사용하여 파일 크기 가져 오기

  6. 6

    PHP를 사용하여 외부 XML 파일에서 데이터 가져 오기

  7. 7

    PHP를 사용하여 외부 XML 파일에서 데이터 가져 오기

  8. 8

    셸 스크립트를 사용하여 파일 이름 만 가져 오기

  9. 9

    Javascript를 사용하여 JSON 파일에서 HTML로 데이터 가져 오기

  10. 10

    FileSystemWatcher를 사용하여 파일 사용 예외 가져 오기

  11. 11

    가져 오기 범위를 사용하여 전체 행이 아닌 단일 셀로 콘텐츠를 가져 오는 방법은 무엇입니까?

  12. 12

    Python pdftables를 사용하여 pdf에서 테이블 데이터를 가져 오는 NotImplementedError 파일 가져 오기

  13. 13

    NodeJS를 사용하여 Google 드라이브 API에서 특정 파일의 콘텐츠 가져 오기

  14. 14

    파일 공급자를 사용하여 sdcard에 저장된 이미지의 콘텐츠 URI 가져 오기

  15. 15

    일부 .lnk 파일을 시작하고 Process.Start 및 SHGetFileInfo ()를 사용하여 아이콘을 가져올 때 오류가 발생했습니다.

  16. 16

    Python 파일 선택기를 사용하여 CSV 파일을 데이터 프레임으로 가져 오기

  17. 17

    OSError 가져 오기 : pyarrow ParquetDataset을 사용하여 파일이 아닌 경로를 전달했습니다.

  18. 18

    python + pyElftools를 사용하여 (avr) elf 파일에서 메모리 레이아웃 가져 오기

  19. 19

    Python pathlib를 사용하여 파일 이름없이 파일의 절대 경로 가져 오기

  20. 20

    와일드 카드를 사용하여 파일에서 Blob 콘텐츠 가져 오기

  21. 21

    루프를 사용하여 많은 파일 가져 오기

  22. 22

    Cypress를 사용하여 Excel 파일 업로드 / 가져 오기

  23. 23

    VBA를 사용하여 Access로 Excel 파일 가져 오기

  24. 24

    gem 'postgres-copy'를 사용하여 csv 파일 가져 오기

  25. 25

    FDBatchMove를 사용하여 CSV 파일을 FDTableTask로 가져 오기

  26. 26

    cbdocloader를 사용하여 JSON 파일을 Couchbase로 가져 오기

  27. 27

    WebClient를 사용하여 인트라넷 파일 가져 오기

  28. 28

    Groovy를 사용하여 파일에서 단어 가져 오기

  29. 29

    가져 오기 내보내기 마법사를 사용하여 DAT 파일 내용을 SQL Server 테이블로 가져 오기-오류

뜨겁다태그

보관