Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取与特定文件夹关联的图标?_C#_Winforms_Icons_Pinvoke_Directory - Fatal编程技术网

C# 如何获取与特定文件夹关联的图标?

C# 如何获取与特定文件夹关联的图标?,c#,winforms,icons,pinvoke,directory,C#,Winforms,Icons,Pinvoke,Directory,在我的一个项目中,我需要从特定文件夹的路径中获取图标 例如: 如果我使用C:\Users\Username\Desktop我想获得与桌面文件夹关联的图标 如果我使用具有自定义图标的文件夹路径,我希望获得该图标 否,我不想要常规默认文件夹图标 我已经找了快三天了,运气不好。非常感谢您的帮助。您可以使用本机SHGetFileInfo函数。您可以使用.net InteropServices导入它 有一篇知识库文章描述了如何做到这一点 编辑: 也 例如: using System; using Sy

在我的一个项目中,我需要从特定文件夹的路径中获取图标

例如:
如果我使用
C:\Users\Username\Desktop
我想获得与桌面文件夹关联的图标
如果我使用具有自定义图标的文件夹路径,我希望获得该图标

否,我不想要常规默认文件夹图标


我已经找了快三天了,运气不好。非常感谢您的帮助。

您可以使用本机SHGetFileInfo函数。您可以使用.net InteropServices导入它

有一篇知识库文章描述了如何做到这一点

编辑:

例如:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace IconTest2
{
    public partial class MainWindow : Window
    {
        //Struct used by SHGetFileInfo function
        [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

        //Constants flags for SHGetFileInfo 
        public const uint SHGFI_ICON = 0x100;
      public const uint SHGFI_LARGEICON = 0x0; // 'Large icon

        //Import SHGetFileInfo function
     [DllImport("shell32.dll")]
     public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

            public MainWindow()
            {
                InitializeComponent();
                SHFILEINFO shinfo = new SHFILEINFO();

                //Call function with the path to the folder you want the icon for
                SHGetFileInfo(
                    "C:\\Users\\Public\\Music",
                    0, ref shinfo,(uint)Marshal.SizeOf(shinfo),
                    SHGFI_ICON | SHGFI_LARGEICON);

                using (Icon i = System.Drawing.Icon.FromHandle(shinfo.hIcon))
                {
                    //Convert icon to a Bitmap source
                    ImageSource img = Imaging.CreateBitmapSourceFromHIcon(
                                            i.Handle,
                                            new Int32Rect(0, 0, i.Width, i.Height),
                                            BitmapSizeOptions.FromEmptyOptions());

                    //WPF Image control
                    m_image.Source = img;
                }
            }
        }
    }

SHGetFileInfo的参考-

脏方法是从desktop.ini抓取它,但由于它是显而易见的(因为它是文件夹中的jst文件),我假设您正在寻找其他东西。。。以下是相同类型的现有问题:(不确定你花了3天的时间做了什么)。这可能包含您开始编写解决方案所需的所有信息。良好的链接-确保提供小的摘要(可能只是电话示例),以使答案符合SO标准。@AlexeiLevenkov更新为添加示例谢谢兄弟,如果可行,我将尝试并标记为答案:Dit可行,但图标的分辨率非常低。。。那么我该如何解决这个问题。。。。。提前谢谢