파일 확장자로부터 아이콘 가져오기

Programming/Visual Basic 2016. 11. 23. 22:04


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Imports Microsoft.Win32
 
''' <summary>확장자로부터 아이콘을 가져오는 모듈입니다.</summary>
Public Module IconModule
    'Win API
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As IntPtrByVal lpszExeFileName As StringByVal nIconIndex As IntegerAs Integer
    Private Declare Function DestroyIcon Lib "User32.dll" (hIcon As IntPtrAs Integer
 
    ''' <summary>확장자으로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="Ext">확장자 값 입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromExt(Ext As StringAs Icon
        Dim Reg = Registry.ClassesRoot, Icon As Icon
        Reg = Reg.OpenSubKey(Ext, False)
        If Reg Is Nothing Then Return Nothing
        Icon = GetDefaultIcon(Reg)
        If Icon IsNot Nothing Then Return Icon
        Icon = GetOpenIcon(Reg)
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Return GetIconFromAppClass(Value)
    End Function
 
    ''' <summary>AppClass로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="AppClass">AppClass 스트링입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromAppClass(AppClass As StringAs Icon
        Dim Reg = Registry.ClassesRoot
        Reg = Reg.OpenSubKey(AppClass, False)
        If Reg Is Nothing Then Return Nothing
        Return If(GetDefaultIcon(Reg), GetOpenIcon(Reg))
    End Function
 
    Private Function GetDefaultIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("DefaultIcon")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Dim FilePath As String = ""
        Dim Index As Integer
        Try
            ParsePath(Value, FilePath, Index)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, Index)
    End Function
 
    Private Function GetOpenIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("shell/open/command")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        If Value.Length = 0 Then Return Nothing
        Dim FilePath As String = ""
        Dim Spt As Integer
        If Value(0= """"Then
            Spt = Value.IndexOf(""""c)
            FilePath = If(Spt = -1, Value.Substring(1), Value.Substring(1, Spt - 1))
        Else
            Spt = Value.IndexOf(" ")
            If Spt = -1 Then Spt = Value.Length
            FilePath = Value.Substring(0, Spt)
        End If
        Try
            FilePath = IO.Path.GetFullPath(FilePath)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, 0)
    End Function
 
    ''' <summary>아이콘의 경로를 파싱하는 함수입니다.</summary>
    ''' <param name="Path">아이콘의 경로입니다.</param>
    ''' <param name="FilePath">반환되는 아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">반환되는 아이콘의 인덱스입니다.</param>
    Private Sub ParsePath(Path As StringByRef FilePath As StringByRef Index As Integer)
        Dim Spt As Integer
        Path = Path.Trim(" "c)
        FilePath = ""
        Index = 0
        If Path.Length = 0 Then Return
        If Path(0= """"Then
            Spt = Path.IndexOf(""""c)
            If Spt = -1 Then
                Spt = Path.Length
                FilePath = Path.Substring(1)
            Else
                FilePath = Path.Substring(1, Spt - 1)
                Spt += 1
            End If
        Else
            Spt = Path.IndexOf(",")
            If Spt = -1 Then Spt = Path.Length
            FilePath = Path.Substring(0, Spt)
        End If
        If Spt = Path.Length Then Return
        Index = CInt(Path.Substring(Spt + 1))
        FilePath = IO.Path.GetFullPath(FilePath)
    End Sub
 
    ''' <summary>아이콘을 가져오는 함수입니다.</summary>
    ''' <param name="FilePath">아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">아이콘의 인덱스입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Private Function GetIcon(FilePath As String, Index As IntegerAs Icon
        Dim hIcon As IntPtr
        hIcon = ExtractIcon(0, FilePath, Index)
        If hIcon = 0 Then Return Nothing
        Dim eIcon = Icon.FromHandle(hIcon).Clone()
        Call DestroyIcon(hIcon)
        Return eIcon
    End Function
End Module
 
cs


사용법은 주석 참조


IconModule.vb


posted by 자칭 프로그래머ㅡ ModMapper