I’ve been having some troubles implementing file preview control utilizing the existing preview handlers (not looking into writing custom preview handlers). I could not get it to work for ".txt", ".jpg", ".bmp", ".dwg", ".mp3".
Here are my findings:
No.1
As most posts mention the preview handler CLSID in registry is not always set for an extension. It could be specified under class name. However what I found that it could be also specified under Perceived Type. That is a case for “.txt” files. I modified the code to look handler CLSID under perceived type if can’t find under extension or class name. After this change the preview works for all “text” files (.txt, .sql, .vb, .cs etc.)
No. 2
I found “mp3file” class name that has a handler. For testing purposes I hardcoded to search for “mp3file” class name instead of one I got from key “.mp3” and that worked just like in Windows Explorer. Again it seems to be just a matter of getting CLSID. After more testing I figured there was another issue. I had VLC player, that changed “.mp3” class name to “VLC.pm3” and that one didn’t have handler’s ID. I looked up “.mp3” on machine that didn’t have VLC, it had a class name “WMP11.AssocFile.MP3” – this one handler’s ID (same as mp3file). After uninstalling VLC on my machine, “.mp3” class name reverted back to “WMP11.AssocFile.MP3” and the preview started working. Note: while still having VLC installed resetting a default program, changing file associations from VLC to Windows Media Player did not change the “.mp3” class name, so I was still unable to get CLSID. But the strange thing is that Windows Explorer showed the preview at all times. It somehow still knew how to get the correct CLSID for “.mp3”. Could it be getting it always from “mp3file” regardless of what class name is set for “.mp3”?
No. 3
I have looked all over the registry and cannot find any handler registrations for any of images. Then I reviewed the list of available handlers under
HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers
I don’t see one for images. Does Windows Explorer handle images differently, not via preview handlers?
So my questions:
1. Am I missing something obvious when getting handler CLSID? What would be a “proper “ way to get CLSID for any file?
2. Handling images is my biggest concern right now. If anyone got the preview working for images and can provide some guidelines it would be much appreciated.
Note: I considered custom handling the images showing them in a PictureBox, but I don’t really like that. First I don’t like inconsistencies. I’d rather use one approach for all files. Secondly my quick test already showed some noticeable differences.
Here’s my current code to get CLSID:
Private Function GetPreviewHandlerGUID(ByVal file As String) As Guid
Dim previewHandlerGUID As Guid = Guid.Empty
Try
Dim key As String = System.IO.Path.GetExtension(file)
Using extensionKey As RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey(key)
If extensionKey IsNot Nothing Then
Using previewHandlerGUIDKey As RegistryKey = extensionKey.OpenSubKey("ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}")
If previewHandlerGUIDKey IsNot Nothing Then
previewHandlerGUID = New Guid(Convert.ToString(previewHandlerGUIDKey.GetValue(Nothing)))
Else
Dim className As String = Convert.ToString(extensionKey.GetValue(Nothing))
If className IsNot Nothing Then
Using classKey As RegistryKey = Registry.ClassesRoot.OpenSubKey(className + "\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}")
If classKey IsNot Nothing Then
previewHandlerGUID = New Guid(Convert.ToString(classKey.GetValue(Nothing)))
Else
Dim perceivedType As String = Convert.ToString(extensionKey.GetValue("PerceivedType", Nothing))
If perceivedType IsNot Nothing Then
Using perceivedTypeKey As RegistryKey = Registry.ClassesRoot.OpenSubKey("SystemFileAssociations\" + perceivedType + "\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}")
If perceivedTypeKey IsNot Nothing Then previewHandlerGUID = New Guid(Convert.ToString(perceivedTypeKey.GetValue(Nothing)))
End Using
End If
End If
End Using
End If
End If
End Using
End If
End Using
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return previewHandlerGUID
End Function
There are some articles on this topic. Below are a few links, but none seems to be working for all files:
http://www.brad-smith.info/blog/archives/183
https://social.msdn.microsoft.com/forums/vstudio/en-US/59e12744-558b-457b-93bb-048b9e0b027e/file-preview-control-in-c (this one also have links to other including to articles on codeproject)
Thank you.