【发布时间】:2015-09-16 10:59:12
【问题描述】:
我正在尝试使用LoadImage WinAPI 函数加载应用程序的图标,但由于某种原因它总是返回 0。
我已经阅读了documentation,但我无法理解我做错了什么。除了尝试将IconPtr 转换为Icon(这是因为IconPtr 为0)之外,我没有任何例外。
Public Shared Function ExtractAssociatedIconArray(ByVal File As String, ByVal Sizes() As Size) As Icon()
Dim ReturnArray(Sizes.Length) As Icon
Dim Index As Integer = 0
For Each s As Size In Sizes
'IconPtr is always zero for some reason.
Dim IconPtr As IntPtr = NativeMethods.LoadImage(Nothing, File, NativeMethods.Enumrations.IMAGE_ICON, s.Width, s.Height, NativeMethods.Enumrations.LR_DEFAULTCOLOR Or NativeMethods.Enumrations.LR_LOADFROMFILE)
ReturnArray(Index) = Icon.FromHandle(IconPtr)
Index += 1
Next
Return ReturnArray
End Function
NativeMethods 类:
Public Class NativeMethods
<DllImport("user32.dll", SetLastError:=True)> _
Public Shared Function LoadImage(ByVal hInst As IntPtr, _
ByVal lpszName As String,
ByVal uType As UInt32, _
ByVal cxDesired As Integer, _
ByVal cyDesired As Integer, _
ByVal fuLoad As UInt32) As IntPtr
End Function
Public Enum Enumrations As UInteger
'' LoadImage ''
IMAGE_BITMAP = 0
IMAGE_ICON = 1
IMAGE_CURSOR = 2
LR_CREATEDIBSECTION = &H2000
LR_DEFAULTCOLOR = &H0
LR_DEFAULTSIZE = &H40
LR_LOADFROMFILE = &H10
LR_LOADMAP3DCOLORS = &H1000
LR_LOADTRANSPARENT = &H20
LR_MONOCHROME = &H1
LR_SHARED = &H8000
LR_VGACOLOR = &H80
End Enum
End Class
使用示例:
Dim Icons() As Icon = ExtractAssociatedIconArray("C:\MyApp.exe", New Size() {New Size() {48, 48}})
【问题讨论】:
-
从文档(甚至从方法的名称)来看,返回的句柄似乎与图像相关联,而不是与图标相关联。您是否尝试过将输出转换为图像/位图(并将此变量转换为图标)?
-
一个EXE文件通常包含多个图标。请注意您从未指定过您想要哪一个。这也不是特别容易找到的,图标资源 ID 是任意的。所以你只是使用了错误的 winapi 函数来完成工作。请改用 Icon.ExtractAssociatedIcon()。
-
@varocarbas : 这无关紧要,因为无论哪种方式,函数都会返回 0。
-
@HansPassant :我在一个 SO 答案中读到 LoadImage 将获得最接近您指定大小的图标/图像。不幸的是,我目前没有该答案的链接。
标签: vb.net winapi icons native-methods