Imports System.Drawing
Module Module1
Sub Main()
Dim filePath As String = "C:\myfile.exe"
Dim TheIcon As Icon = IconFromFilePath(filePath)
If TheIcon IsNot Nothing Then
''#Save it to disk, or do whatever you want with it.
Using stream As New System.IO.FileStream("c:\myfile.ico", IO.FileMode.CreateNew)
TheIcon.Save(stream)
End Using
End If
End Sub
Public Function IconFromFilePath(filePath As String) As Icon
Dim result As Icon = Nothing
Try
result = Icon.ExtractAssociatedIcon(filePath)
Catch ''# swallow and return nothing. You could supply a default Icon here as well
End Try
Return result
End Function
End Module
Проигнорируйте всех говорящие Вам использовать реестр! Реестр НЕ является API AN. API, который Вы хотите, является SHGetFileInfo с SHGFI_ICON. Можно получить подпись P/Invoke здесь:
Этот ссылка, кажется, имеет некоторую информацию. Это включает много пересекающего реестра, но это кажется выполнимым. Примеры находятся в C++
"HKCR\.{extension}"
, считайте значение по умолчанию (давайте назовем его filetype
) "HKCR\{filetype}\DefaultIcon"
, считайте значение по умолчанию: это - путь к файлу значка (или файл контейнера значка, как .exe со встроенным ресурсом значка) , редактируют/перемещают из комментариев:
, Если значок находится в контейнерном файле (это довольно распространено), будет счетчик после пути, как это: "foo.exe,3"
. Это означает, что это - значок номер 4 (индекс основан на нуле) доступных значков. Значение", 0 дюймов являются неявными (и дополнительными). Если счетчик будет 0 или пропавшие без вести, кулак, то доступный значок будет использоваться оболочкой.
You should use SHGetFileInfo.
Icon.ExtractAssociatedIcon works just as well as SHGetFileInfo in most cases, but SHGetFileInfo can work with UNC paths (e.g. a network path like "\\ComputerName\SharedFolder\") while Icon.ExtractAssociatedIcon cannot. If you need or might need to use UNC paths, it would be best to use SHGetFileInfo instead of Icon.ExtractAssociatedIcon.
This is good CodeProject article on how to use SHGetFileInfo.