gpt4 book ai didi

c# - 是否可以使用 Windows 图标选择器对话框?

转载 作者:行者123 更新时间:2023-11-30 21:28:50 26 4
gpt4 key购买 nike

在我的代码中,我希望我的用户能够从他们计算机上的任何位置选择一个图标。图标可以是独立的 .ico 或者它可以是 .exe.dll 中的图标 - 不仅如此.exe/dll 的默认显示图标以及其中包含的任何其他图标。

在理想情况下,我希望能够使用 native Windows 图标选择器对话框:

Windows Icon Picker Dialog

但我不知道如何使用它 - 这可能吗?这个对话框对我来说是理想的,因为它似乎只允许用户浏览图标或 .exe.dll 作为标准。

如果我的用户只能使用独立的 .ico 文件,那么我会选择使用 Microsoft.WindowsAPICodePack 中的 CommonOpenFileDialog 类。 Windows Visa+ 的 Shell nuget 包和旧系统的 System.Windows.Forms.FolderBrowserDialog - 像这样:

private string SelectWinXPIcon()
{
using (WinForms.OpenFileDialog ofd = new WinForms.OpenFileDialog()
{
Filter = "Icon files (*.ico)|*.ico",
})
{
WinForms.DialogResult result = ofd.ShowDialog();
switch (result)
{
case WinForms.DialogResult.OK:
case WinForms.DialogResult.Yes:
return ofd.FileName;

default:
return null;
}
}
}

private string SelectWinVistaIcon()
{
using (CommonOpenFileDialog dialog = new CommonOpenFileDialog
{
DefaultDirectory = @"C:\",
AllowNonFileSystemItems = false,
EnsurePathExists = true,
Multiselect = false,
NavigateToShortcut = true
})
{
dialog.Filters.Add(new CommonFileDialogFilter("Icon Files (*.ico)", ".ico"));
CommonFileDialogResult result = dialog.ShowDialog();

switch (result)
{
case CommonFileDialogResult.Ok:
return dialog.FileName;

default:
return null;
}
}
}

但据我所知,这条路线不允许我的用户从 .exe/dll 中选择图标?

如果无法使用图标选择器对话框,是否有另一种方法可以从 .exe/dll 中提取图标,这也允许独立的 .ico 要选择的文件?

最佳答案

这是通过 shell32 PickIconDlg 函数完成的,您可以使用 pinvoke site 轻松调用该函数以供引用。该函数将返回文件名和索引,然后您可以使用 the shell32 ExtractIconEx function 提取图标句柄。 .然后,您可以将图标句柄转换为 GDI 图标或 WPF ImageSource。

例如,在 XAML 中声明一个图像以显示用户选择的图标:

<Image x:Name="myImage" Stretch="None" />

然后在您的窗口加载处理程序中使用此代码来显示对话框、加载它、将其转换为 ImageSource 并显示它:

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int PickIconDlg(IntPtr hwndOwner, System.Text.StringBuilder lpstrFile, int nMaxFile, ref int lpdwIconIndex);

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern uint ExtractIconEx(string szFileName, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool DestroyIcon(IntPtr handle);

private const int MAX_PATH = 0x00000104;

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
// show the Pick Icon Dialog
int index = 0;
int retval;
var handle = new WindowInteropHelper(this).Handle;
var iconfile = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\shell32.dll";
var sb = new System.Text.StringBuilder(iconfile, MAX_PATH);
retval = PickIconDlg(handle, sb, sb.MaxCapacity, ref index);

if (retval != 0)
{
// extract the icon
var largeIcons = new IntPtr[1];
var smallIcons = new IntPtr[1];
ExtractIconEx(sb.ToString(), index, largeIcons, smallIcons, 1);

// convert icon handle to ImageSource
this.myImage.Source = Imaging.CreateBitmapSourceFromHIcon(largeIcons[0],
Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

// clean up
DestroyIcon(largeIcons[0]);
DestroyIcon(smallIcons[0]);
}
}

这将适用于 DLL/EXE 等以及独立的 .ICO 文件。

关于c# - 是否可以使用 Windows 图标选择器对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com