Моя цель:
Сохранение всех Window Icon Handle
(HICON
) из HIMAGELIST
в виде нескольких файлов изображений (.png
или *) 1011 *).
Моя проблема:
После моей процедуры сохранения некоторые изображения имеют низкое качество, а некоторые нет.
Я заметил эту проблему только на изображениях папок с подпапками / подпапками.
Моя попытка:
Фон кода:
- Я использую
Vanara
, чтобы помочь мне с вызовами PInvoke и многое другое . - * * * * * * * * * * * * * * * * * * * * * * * * *
- * * * * * *1050* * * * * * * *1050* * * * * * * * *1050* * * * * * * * * *1050* * Этот метод является частью расширения Shell (я знаю, я не должен был делать что).
private void Saving()
{
var hWnd = GetListViewHWnd(); // This is the Desktop SysListView32 HWND
IntPtr lParam = IntPtr.Zero;
IntPtr pHil = SendMessage(hWnd, ListViewMessage.LVM_GETIMAGELIST, 0, ref lParam);
var sHil = new SafeHIMAGELIST(pHil); // This is the IMAGELIST of the ListView
var imageCount = sHil.Interface.GetImageCount(); // sHil.Interface == IImageList Interface
for (int i = 0; i < imageCount; i++)
{
using (var fs = File.OpenWrite(@"C:\Users\Julien\Desktop\Icons\" + i + ".tiff"))
{
using (SafeHICON sHIcon = sHil.Interface.GetIcon(i, IMAGELISTDRAWFLAGS.ILD_NORMAL))
{
var bmpS = Imaging.CreateBitmapSourceFromHIcon(
sHIcon.DangerousGetHandle(),
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
BitmapEncoder enc = new TiffBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bmpS));
enc.Save(fs);
}
}
}
sHil.Dispose();
}
Также:
var bmp = Bitmap.FromHicon(sHIcon.DangerousGetHandle());
bmp.Save(fs);
FAQ:
Почему я использую список изображений listview, а не SHGetFileInfo
?
Поскольку SHGetFileInfo
даст мне HICON
вот так:
* 107 7 *
для папки, которая на самом деле выглядит следующим образом:
Как насчет передачи SHGFI_SYSICONINDEX
в SHGetFileInfo
?
То же самое, значки непустых папок не хранятся в списке образов системы.
Поскольку я могу написать свое расширение на C ++, я открыт для любого написанного решения в C ++ тоже.
Редактировать: Я попытался нарисовать эти сбитые изображения, используя IImageList.Draw()
, и это, кажется, работает. Ясно, что проблема возникает из-за того, как я создаю изображение из HICON
.
var hdc = GetDC(notepadHWnd);
var dp = new IMAGELISTDRAWPARAMS(
hdc,
new RECT(73, 73, 73, 73), 12,
COLORREF.None,
IMAGELISTDRAWFLAGS.ILD_NORMAL);
sHil.Interface.Draw(dp);