Да, это довольно раздражает. Но проблема с предлагаемым ответом Icon.ExtractAssociatedIcon заключается в том, что он извлечет значок 32x32, а затем уменьшит его до значка 16x16 в окне форм или на панели задач, что будет выглядеть ужасно, если только значок 32x32 не будет очень умно сконструирован.
Я делаю это с помощью взаимодействия (поместите первую строку в конструкторе формы):
this.Icon = ExtractSmallIconFromLibrary(Application.ExecutablePath);
...
public static Icon ExtractSmallIconFromLibrary(string file) {
IntPtr[] reficon = new IntPtr[1];
int nextracted = ExtractIconEx(file, 0, null, reficon, 1);
if (nextracted < 1)
return null;
Icon unmanaged_icon = Icon.FromHandle(reficon[0]);
Icon icon = (Icon)unmanaged_icon.Clone();
DestroyIcon(unmanaged_icon.Handle);
return icon;
}
[DllImport("Shell32", CharSet = CharSet.Auto)]
extern static int ExtractIconEx(
[MarshalAs(UnmanagedType.LPTStr)]
string lpszFile,
int nIconIndex,
IntPtr[] phIconLarge,
IntPtr[] phIconSmall,
int nIcons
);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);
Но это тоже не здорово, поскольку вы делаете хотите значок 32x32 для таких вещей, как список значков Alt-Tab. Таким образом, вам действительно нужно извлечь значок whole , что является более сложной задачей. Может быть, есть простой способ объединить две иконки в одну. Или вы можете сделать так: codeproject программа, которая сначала извлекает весь значок с огромной кучей кода.