2009-10-05 5 views
1

У меня есть путь к файлу .exe.Найти значок для .exe

Как найти путь к значку, который будут использовать окна, если этот файл был удален на рабочем столе? (Я хочу отобразить этот значок в моей собственной программе.)

Мне нужно найти значок через мою программу на C# во время выполнения.

Использование C# в Visual Studio 2008.

ответ

6

Если нашел этот код на сайте некоторое время назад, чтобы сделать это:

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); 

    public static Bitmap GetFileIcon(string fName) 
    { 
     IntPtr hImgSmall; //the handle to the system image list 
     SHFILEINFO shinfo = new SHFILEINFO(); 
     hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON); 
     return Icon.FromHandle(shinfo.hIcon).ToBitmap(); 
    } 
} 


[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; 
}; 

также необходимо

using System.Drawing; 
using System.Runtime.InteropServices; 

ссылаться на все соответствующие классы

+1

Единственное, что я хотел бы добавить здесь, это SHGFI_USEFILEATTRIBUTES = 0x010. Из MSDN: если параметр uFlags включает флаг SHGFI_USEFILEATTRIBUTES, этот параметр не должен быть допустимым именем файла. Функция будет действовать так, как если бы файл существовал с указанным именем и с атрибутами файла, переданными в параметре dwFileAttributes. Это позволяет вам получать информацию о типе файла, передавая только расширение для pszPath и передавая FILE_ATTRIBUTE_NORMAL в dwFileAttributes. –

+0

Это оказалось более правильным для моей потребности, чем класс, рекомендованный Нолдорином. Хотя класс мог идентифицировать многие значки, он иногда не нашел тот, который фактически использовался. Представленный здесь код всегда находит тот же значок, который находится на рабочем столе. Большое спасибо. –

0

значок по умолчанию будет один встроенный в ехе с индексом 0.

Посмотрите: Project свойства> вкладка приложения> Icon.

+0

Гм ... не совсем то, что мне нужно. Думаю, я был неясен. Я хочу отказаться от ЛЮБОГО .exe, используя перетаскивание (именно так я получаю путь), а затем ищите значок программно. –

0

This CodeProject article, кажется, делает работу довольно Что ж. Он предоставляет класс IconExtractor, который инкапсулирует все компоненты API Win32 для вас в удобный управляемый интерфейс.

Вы можете использовать его в качестве такового:

using TKageyu.Utils; 

... 

using (IconExtractor ie = new IconExtractor(@"D:\sample.exe")) 
{ 
    Icon icon0 = ie.GetIcon(0); 
    Icon icon1 = ie.GetIcon(1); 

    ... 

    Icon[] splitIcons = IconExtractor.SplitIcon(icon0); 

    ... 
} 
+0

Обратите внимание, что это возвращает значок GDI + ('System.Drawing'), а не WPF. Я предполагаю, что это то, что вы хотите. – Noldorin

+0

Это было так просто реализовать и хорошо работало. Благодарю. –

+0

Нет проблем. И да, всегда удобно иметь класс-оболочку для работы с Windows API. – Noldorin