Я не думаю, что это можно сделать так, как вы хотите, и для этого есть объективные причины.
Во-первых, процесс связывания оболочки начинается с расширения до сопоставления приложения, и это четко определенный процесс без классов файлов, созданных поверх набора расширений.
Во-вторых, не существует такой вещи, как "видео файлы" на первом месте. .mp4 и .webm не совсем видеофайлы, потому что, в частности, они могут содержать только аудиодорожки и, следовательно, быть аудиофайлами. Media API начинают чтение файлов с изучения деталей формата контейнера, идентификации дорожек и объявления о доступности дорожек / потоков для одноранговых API, таких как кодеки. То есть, «видеофайлы», во-первых, не очень строгое определение.
В-третьих, медиа-API, такие как DirectShow и Media Foundation, не используют сопоставление оболочки, когда речь идет о воспроизведении. Оболочка ассоциации и HKEY_CLASSES_ROOT
используется только когда дело доходит до выбора приложения-обработчика. API-интерфейсы определяют свой собственный метод построения конвейера для данного файла, и они имеют свою собственную отдельную коллекцию обработчиков, определенных для расширения. Затем эти API-интерфейсы способны определять формат файлов с «неправильным» расширением, просматривая сами данные полезной нагрузки: если вы переименуете .wav в .avi, файл останется воспроизводимым, даже если форматы отличаются.
Если вы хотите идентифицировать видеофайл в своем приложении, не слишком задумываясь о формате файла, почему бы просто не использовать один из упомянутых медиа-API и открыть файл. Если через API видно, что файл предоставляет видео дорожку, то это видео файл. Несмотря на то, что я не думаю, что понял детали, почему вам нужно точно отфильтровывать видеофайлы, я, вероятно, рекомендую этот подход.
Возможно, вы также можете использовать обработчики свойств оболочки - PSLookupPropertyHandlerCLSID
и друзей - для проверьте, является ли файл мультимедийным файлом. В видеофайле будет указано одно из свойств, связанных с видео, например PKEY_Video_FrameWidth
.
Тогда, если вам просто нужно приблизительное предположение, является ли файл видеофайлом, вы можете проверить расширение по списку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMap
.
Еще один быстрый способ проверить, может ли это быть видеофайл, - это проверить расширение по списку ассоциаций, заданному API c, например, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\ByteStreamHandlers
. Это похоже на использование Media Foundation API, о котором я упоминал выше, но без его использования. В этом разделе реестра расширения ассоциируются с примитивами API c, а не с ассоциативными расширениями оболочки.