가능합니까? 그것은 나에게 오류를 준다. 그리고 나는 이전에 그것이 폴더와 드라이브를 위해서도 작동 할 수 있다고 생각했다.Icon.ExtractAssociatedIcon은 파일이 아닌 것에 대한 것입니까?
Icon.ExtractAssociatedIcon ("C : \")이 시도 할 때 작동하지 않아 오류가 발생했습니다.
어떻게 모든 항목에서 관련 아이콘을 얻을 수 있습니까? 이것은 vb.net입니다
가능합니까? 그것은 나에게 오류를 준다. 그리고 나는 이전에 그것이 폴더와 드라이브를 위해서도 작동 할 수 있다고 생각했다.Icon.ExtractAssociatedIcon은 파일이 아닌 것에 대한 것입니까?
Icon.ExtractAssociatedIcon ("C : \")이 시도 할 때 작동하지 않아 오류가 발생했습니다.
어떻게 모든 항목에서 관련 아이콘을 얻을 수 있습니까? 이것은 vb.net입니다
SHGetFileInfo() 셸 함수는 찾고있는 아이콘을 제공 할 수 있습니다. 이 코드는 드라이브, 폴더 및 파일에 대한 적절한 아이콘을 생성, 잘 작동 :
Imports System.Drawing
Imports System.Reflection
Imports System.Runtime.InteropServices
Public Module NativeMethods
Public Function GetShellIcon(ByVal path As String) As Icon
Dim info As SHFILEINFO = New SHFILEINFO()
Dim retval as IntPtr = SHGetFileInfo(path, 0, info, Marshal.SizeOf(info), &H100)
If retval = IntPtr.Zero Then Throw New ApplicationException("Could not retrieve icon")
'' Invoke private Icon constructor so we do not have to copy the icon
Dim cargt() As Type = { GetType(IntPtr) }
Dim ci As ConstructorInfo = GetType(Icon).GetConstructor(BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, cargt, Nothing)
Dim cargs() As Object = { info.IconHandle }
Dim icon As Icon = CType(ci.Invoke(cargs), Icon)
Return icon
End Function
'' P/Invoke declaration
Private Structure SHFILEINFO
Public IconHandle As IntPtr
Public IconIndex As Integer
Public Attributes As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public DisplayString As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public TypeName As String
End Structure
Private Declare Auto Function SHGetFileInfo lib "Shell32.dll" (path As String, _
attributes As Integer, byref info As SHFILEINFO, infoSize As Integer, flags As Integer) As IntPtr
End Module
파일 이외의 다른 것에는 Icon.ExtractAssociatedIcon을 사용할 수 없습니다. 이 API는 Win32 호출 ExtractAssociatedIcon의 맨 위에있는 얇은 래퍼입니다. 관리되는 코드의 설명서가 약간 모호하지만 원시 문서는 대상이 파일이어야한다는 점이 훨씬 명확합니다. 그것은 실행 파일이어야한다고 말합니다.
안타깝게도 디렉토리에 상응하는 기능이 있는지 여부는 확실하지 않습니다.
아야>< 폴더가 드라이브 또는 표준 폴더인지 여부를 알 수있는 방법이 있나요.? – Cyclone
내 답변에 따르면 [여기] (http://stackoverflow.com/a/21613348/939213) CLR은 자동으로 [SHGetFileInfo docs]와 일치하는 IntPtr을 해제하지 않습니다 (http : // msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx)'DestroyIcon'을 사용하여 자유롭게 할 책임이 있습니다. 그래서 당신의 코드가 여기에'DestroyIcon'을 놓치지 않았습니까? (저는 여기서 완전히 벗어 났을 것입니다 .BB.net을 알지 못합니다.) – ispiro
아니요. ConstructorInfo 트릭이 전부입니다. Icon 클래스가 현재 핸들을 소유하고 있음을 알립니다. 개체가 가비지 수집 될 때 자동으로 DestroyIcon이 호출되도록합니다. Icon 객체가 어디에도 사용되지 않을 것이라는 확실한 보장이있을 때까지는 DestroyIcon을 호출하는 것이 타당하지 않으므로 다른 방법을 사용하는 것은 매우 어렵습니다. –
감사합니다. 나는 (코드에서) 당신이'icon2 = (Icon) icon1.Clone();을 할 필요가 있다는 것을 당신의 의견에서 깨달았다. 등. 나는 또한 아이콘을 파괴하는 것을 처리 할 것임을 깨닫지 못했다. 좋은. 다시 한번 감사드립니다. – ispiro