WM_GETICON 有时不返回图标句柄
我试图显示所有窗口标题,包括相应的图标,就像 Windows 任务管理器那样。但这仅在一定程度上有效 - 尽管我能够获取窗口的标题栏文本,但该图标并不总是可用。
为了获取图标,我将 WM_GETICON
消息传递给 SendMessage
(source):
Public Const WM_GETICON As UInteger = &H7F
Public Function GetWindowIcon(ByVal WindowHandle As IntPtr) As Icon
Dim IconHandle As IntPtr = SendMessage(WindowHandle, WM_GETICON, 0, 0)
If Not IconHandle = IntPtr.Zero Then
Return Icon.FromHandle(IconHandle)
Else
Return Nothing
End If
End Function
对于某些窗口,这仅返回正确的图标。对于其他情况,它返回 Nothing
,因为 IconHandle
等于 0
。在 Windows 任务管理器和任务栏上,它们显示得很好。
造成这种情况的原因是什么?我该如何解决这个问题?
I'm trying to show all window titles including the corresponding icons, much like Windows Task Manager does. This works only to a certain extent though - although I am able to get the windows' title bar texts, the icon is not always available.
For getting the icon I pass the WM_GETICON
message to SendMessage
(source):
Public Const WM_GETICON As UInteger = &H7F
Public Function GetWindowIcon(ByVal WindowHandle As IntPtr) As Icon
Dim IconHandle As IntPtr = SendMessage(WindowHandle, WM_GETICON, 0, 0)
If Not IconHandle = IntPtr.Zero Then
Return Icon.FromHandle(IconHandle)
Else
Return Nothing
End If
End Function
For some windows, this returns just the correct icon. For others, it returns Nothing
since IconHandle
is equal to 0
. In Windows Task Manager and on the taskbar they show up just fine.
What could be the cause of this, and how might I go about solving this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用一些复制粘贴和混乱,我最终得到了以下代码......但它现在适用于所有窗口。
基本上,它尝试
WM_GETICON
来获取大图标。如果失败,它会调用GetClassLong
,其中有时包含图标。否则,使用WM_GETICON
来获取小图标。在前两种情况下,我必须将其转换为位图,将其大小调整为 16x16(我需要该大小),然后将其转换回图标。Using some copy-and-pasting and messing around, I ended up with the following code... But it now works for all windows.
Basically, it tries
WM_GETICON
to get a large icon. If it fails, it callsGetClassLong
, which sometimes includes the icon. Otherwise,WM_GETICON
is used to get the small icon. In the first two cases, I had to convert it into aBitmap
, resize it to 16x16 (I need that size), and then convert it back to anIcon
.