Мне нужно добавить значок любого файла, который я выбрал во время выполнения.
У меня есть проект, который снабжен кнопкой (при нажатии откроется диалоговое окно, позволяющее выбрать, какой файл вам нужен)
Когда пользователь выбирает файл (AutoCad, MS Office и т. д.), мне нужно, чтобы мой проект считывал значок принадлежности этого файла и вставлял этот значок в окно изображения.
Тот же самый сказал мне, что вы можете найти все значки, которые окна использовали для отображения «значков», вы можете прочитать из реестра ... но он не знает, где их найти, или он уверен или нет.
2 ответа
Вы можете использовать функцию SHGetFileInfo.
Попробуйте этот код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
[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;
public const uint SHGFI_SMALLICON = 0x1;
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbSizeFileInfo,
uint uFlags);
}
private void button1_Click(object sender, EventArgs e)
{
string fName;
SHFILEINFO shinfo = new SHFILEINFO();
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fName = openFileDialog1.FileName;
Win32.SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON);
System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
pictureBox1.Image=(Image) myIcon.ToBitmap();
}
}
public Form1()
{
InitializeComponent();
}
}
}
Я предполагаю, что вы знаете, как установить изображение для PictureBox, и что это именно тот значок, который вы ищете.
Это даст вам путь к значку по умолчанию для конкретной программы:
HKEY_CLASSES_ROOT\<ProgramID>\DefaultIcon
...где ProgramID – это по существу тип открываемого файла (например, Excel.AddIn). Если вы не уверены в том, какой ProgramID вам нужен, вы должны сначала найти под записью соответствующее расширение (.doc, .xls и т. д.), которое также находится в пределах HKEY_CLASSES_ROOT
.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.