如何检索与文件类型关联的文件图标,并将其与vb.net中的Listview项目一起添加
我读到了关于SHGetFileInfo的内容,但我对此不了解
请给我解决方案或请解释我的系统与.net控件的详细信息
答案 0 :(得分:6)
抬头SHGetFileInfo我可以看到你为什么对它感到困惑,但我认为对于我认为你想要做的事情可能有点过分,即枚举文件夹的内容和添加项目列表视图。
如果我们有一个包含ListView和ImageList的表单,并且通过将ListView的LargeImageList属性设置为ImageList来关联这两个,那么我们将如何将文件夹的内容放入ListView,其中的图标来自每个文件的关联EXE文件。
Imports System.IO
Imports System.Drawing
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dirInfo As DirectoryInfo
Dim fileInfo As FileInfo
Dim exePath As String
Dim exeIcon As Icon
dirInfo = New DirectoryInfo(path_to_some_folder
'We use this For...Each to iterate over the collection of files in the folder
For Each fileInfo In dirInfo.GetFiles
'We can only find associated exes by extension, so don't show any files that have no extension
If fileInfo.Extension = String.Empty Then
Else
'Use the function to get the path to the executable for the file
exePath = GetAssociatedProgram(fileInfo.Extension)
'Use ExtractAssociatedIcon to get an icon from the path
exeIcon = Drawing.Icon.ExtractAssociatedIcon(exePath)
'Add the icon if we haven't got it already, with the executable path as the key
If ImageList1.Images.ContainsKey(exePath) Then
Else
ImageList1.Images.Add(exePath, exeIcon)
End If
'Add the file to the ListView, with the executable path as the key to the ImageList's image
ListView1.Items.Add(fileInfo.Name, exePath)
End If
Next
End Sub
GetAssociatedProgram来自developer.com
Public Function GetAssociatedProgram(ByVal FileExtension As _
String) As String
' Returns the application associated with the specified
' FileExtension
' ie, path\denenv.exe for "VB" files
Dim objExtReg As Microsoft.Win32.RegistryKey = _
Microsoft.Win32.Registry.ClassesRoot
Dim objAppReg As Microsoft.Win32.RegistryKey = _
Microsoft.Win32.Registry.ClassesRoot
Dim strExtValue As String
Try
' Add trailing period if doesn't exist
If FileExtension.Substring(0, 1) <> "." Then _
FileExtension = "." & FileExtension
' Open registry areas containing launching app details
objExtReg = objExtReg.OpenSubKey(FileExtension.Trim)
strExtValue = objExtReg.GetValue("").ToString
objAppReg = objAppReg.OpenSubKey(strExtValue & _
"\shell\open\command")
' Parse out, tidy up and return result
Dim SplitArray() As String
SplitArray = Split(objAppReg.GetValue(Nothing).ToString, """")
If SplitArray(0).Trim.Length > 0 Then
Return SplitArray(0).Replace("%1", "")
Else
Return SplitArray(1).Replace("%1", "")
End If
Catch
Return ""
End Try
End Function
在所有这些结束时,当您在此文件夹上运行此代码时:
alt text http://www.philippursglove.com/stackoverflow/listview1.png
你应该得到:
alt text http://www.philippursglove.com/stackoverflow/listview2.png
答案 1 :(得分:-1)
如果您知道所需文件的文件名,则可以使用System.Drawing.Icon.ExtractAssociatedIcon
功能。 e.g。
Icon ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe");
您还可以参考我对related question的回答,了解更多实施细节。