gpt4 book ai didi

c# - 如何从 C# 调用 SHExtractIconsW?

转载 作者:行者123 更新时间:2023-11-30 22:18:37 24 4
gpt4 key购买 nike

如何在 C# 中使用 SHExtractIconsW dll 函数,我在 AutoIt 中做到了这一点,

Local $arResult = DllCall('shell32.dll', 'int', 'SHExtractIconsW', _
'wstr', $sIcon, _
'int', $aDetails[5], _
'int', $iSize, _
'int', $iSize, _
'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)

这是对微软网站的引用,http://msdn.microsoft.com/en-us/library/windows/desktop/bb762163(v=vs.85).aspx

基本上我想从 exe 文件中提取图标,但这里的几乎所有示例都不能做到这一点,在 autoit 中我可以使用 SHExtractIconsW 做到这一点,所以我想在 C# 中尝试。

注意:我想要 64x64 到 256x256 的图标大小,而不是以下。

最佳答案

这看起来很糟糕 documented功能。

phIcon 的文档说:

When this function returns, contains a pointer to the array of icon handles.

但由于参数的类型为 HICON*,调用者必须提供数组。

pIconId 的文档也是错误的。原来也是一个数组。

所有编码都可以使用默认设置完成。由于此 API 没有 ANSI 版本,请为其提供全名 SHExtractIconsW 并将 Charset 设置为 Unicode。

到目前为止documentation去,没有提到 SetLastError 被调用。

[DllImport("Shell32.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
static extern uint SHExtractIconsW(
string pszFileName,
int nIconIndex,
int cxIcon,
int cyIcon,
IntPtr[] phIcon,
uint[] pIconId,
uint nIcons,
uint flags
);

要调用它,您需要像这样分配数组:

IntPtr[] Icons = new IntPtr[nIcons];
uint[] IconIDs = new uint[nIcons];

最后,我附和@Cody 的评论。由于此 API 显然没有正确记录,因此我会尝试使用已正确记录并且您将来可以依赖的替代 API。


由于您似乎在努力使这一切正常工作,这里有一个有趣的程序可以从 shell32.dll 中提取和显示图标。我没有尝试做任何错误检查,没有在图标上调用 DestroyIcon 等等。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication12
{
public partial class Form1 : Form
{
[DllImport("Shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint SHExtractIconsW(
string pszFileName,
int nIconIndex,
int cxIcon,
int cyIcon,
IntPtr[] phIcon,
uint[] pIconId,
uint nIcons,
uint flags
);

public Form1()
{
InitializeComponent();
}

private IntPtr[] Icons;
private int currentIcon = 0;
uint iconsExtracted;

private void Form1_Load(object sender, EventArgs e)
{
uint nIcons = 1000;
Icons = new IntPtr[nIcons];
uint[] IconIDs = new uint[nIcons];
iconsExtracted = SHExtractIconsW(
@"C:\Windows\System32\shell32.dll",
0,
256, 256,
Icons,
IconIDs,
nIcons,
0
);
if (iconsExtracted == 0)
;//handle error
Text = string.Format("Icon count: {0:d}", iconsExtracted);
}

private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Image = Bitmap.FromHicon(Icons[currentIcon]);
currentIcon = (currentIcon + 1) % (int)iconsExtracted;
}
}
}

关于c# - 如何从 C# 调用 SHExtractIconsW?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979804/

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