Windows 7 視頻文件縮略圖

  轉載自http://blogs.itecn.net/blogs/shehuayu/archive/2010 /07/17/dig-into-windows-7.aspx

  在裝好 Windows 7 之後,相信有很多人跟筆者一樣,會陸陸續續再裝一些影音文件播放器,例如 KMPlayer、QQ影音、千千靜聽、暴風影音等等。久而久之,突然某一天,您可能發現在資源管理器中,一些諸如 avi、wmv、mpeg 、asf等格式的視頻文件的縮略圖不再顯示,只能顯示一個大大的圖標,就像下面這樣:

  當然,上面的內容只是一個引子,由於時間久遠,筆者發現不及時,已經無從評估究竟是哪一款軟件引發的問題。據網友反映,很多人在卸載暴風影音後,視頻縮略圖恢復正常,不過,筆者並未使用過此軟件。但筆者認爲,一般是這樣的第三方的媒體播放器或解碼軟件軟件造成了該問題。

  下面,我們一起來深入研究這個問題的背後的根層原因是什麼。

  我們使用 Sysinternals 的利器 ProcessMonitor 對打開視頻文件夾時的 Windows 資源管理器進程 explorer.exe 進行一個監控,結果如下:

  我們可以發現,它除了在最後操作文件以外,之前都是訪問一系列的註冊表項目。因此,我們可以鎖定該錯誤的誘因是位於系統註冊表的。

  進一步觀察我們可以發現,就關於這個.asf格式的註冊表項,既有 HKCU 的部分,也有 HKCR 的部分。由於筆者新建了一個用戶賬戶進行測試,仍不能正常顯示視頻文件縮略圖,故可以排除 HKCU 的可能,問題的原因就應該在 HKCR 部分的文件類型註冊項目。

  這裏必須有個說明,就是本文所討論的這個不顯示視頻文件縮略圖的現象是一個系統軟件環境錯誤,而不是 Windows 的功能選項效果。也就是說,您必須確保您的"文件夾選項"裏面被正確配置爲顯示文件縮略圖(但縮略圖卻偏偏顯示不出來):

  如上圖所示,您必須確保高亮部分--"始終顯示圖標,從不顯示縮略圖"一項前的複選框處於清空狀態。

  好了,我們接下來定位至註冊表 HKEY_CLASSES_ROOT 區域下面的 .asf 部分,看到如圖所示的情景:

  通過比對虛擬機中的 Windows 7 以及比對能夠顯示縮略圖的註冊文件類型,我才發現這裏 ShellEx 下兩個 GUID 項目下的"默認"鍵值被莫名地清空了,什麼也沒有。於是,我們就找到了問題的所在。其實, Windows 資源管理器不能顯示視頻縮略圖的根本原因就是 ShellEx 下面的兩個 GUID 項目值缺失導致的。這裏,我們以文本形式展示一下問題註冊表和虛機中正常註冊表關於 .asf 項目的對比: 出現問題的註冊表 .asf 項 正常 / 默認的註冊表 .asf 項 [HKEY_CLASSES_ROOT\.asf] @="KMPlayer.asf" "PerceivedType"="video" "Content Type"="video/x-ms-asf" "KMPBackup.bak"="WMP11.AssocFile.ASF" [HKEY_CLASSES_ROOT\.asf\OpenWithProgIds] "WindowsLive.PhotoGallery.video.15.3"="" "WindowsLive.MovieMaker.asset"=hex: [HKEY_CLASSES_ROOT\.asf\ShellEx] [HKEY_CLASSES_ROOT\.asf\ShellEx\{BB2E617C-0920-11D 1-9A0B-00C04FC2D6C1}] @="" [HKEY_CLASSES_ROOT\.asf\ShellEx\{e357fccd-a995-457 6-b01f-234630154e96}] @="" [HKEY_CLASSES_ROOT\.asf] @="WMP11.AssocFile.ASF" "PerceivedType"="video" "Content Type"="video/x-ms-asf" [HKEY_CLASSES_ROOT\.asf\OpenWithProgIds] "WMP11.AssocFile.ASF"=hex(0): [HKEY_CLASSES_ROOT\.asf\PersistentHandler] @="{098f2470-bae0-11cd-b579-08002b30bfeb}" [HKEY_CLASSES_ROOT\.asf\ShellEx] [HKEY_CLASSES_ROOT\.asf\ShellEx\{BB2E617C-0920-11D 1-9A0B-00C04FC2D6C1}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" [HKEY_CLASSES_ROOT\.asf\ShellEx\{e357fccd-a995-457 6-b01f-234630154e96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" 這裏呢,我們解釋幾個重要的概念。@ 後面的鍵值就是註冊表中"默認"處的鍵值。在上面的表格中我們可以看出,默認的 asf 文件格式是關聯到 KMPlayer 的。但是筆者的 KMPlayer 已經卸載了,爲什麼這個鍵值沒有被替換還原或者刪除呢?查閱 MSDN 發現,這個是正常的,該鍵值僅用於標識安裝默認關聯該文件類型的程序之後,這樣的關聯是否發生了更改。現在筆者卸載了 KMPlayer,那麼當我雙擊 asf 文件時,雖然存有這個鍵值但是默認卻用 Windows Media Player 打開,原因是這個默認關聯鍵值是要配合 OpenWithProgIds 裏面的程序列表使用的,這裏面已經沒有 KMPlayer 了,所以 @ 也就不起作用了。當然,程序的文件類型關聯鍵值不止這裏的一處,還有類似於 WMP11.AssocFile.ASF 這樣的註冊表項目決定,這已經超出本文討論範圍,就不在本文贅述了。而 PerceivedType 是用來標識這個文件類是屬於什麼類型的文件的,例如,標識一個自定義擴展名究竟是屬於文本還是屬於聲音、視頻等等。在 Windows Vista 及其之後版本的 Windows 中,該鍵值才真正起作用,因爲現在,Windows 用它來識別一個文件夾中有些什麼類型的文件,從而決定自動將文件夾應用何種最佳的視圖。Windows 默認的 PerceivedType 共有11中,這裏也不再贅述,有興趣的朋友們可以查看這篇 MSDN 文章-- http://msdn.microsoft.com/en-us/library/cc144150(v =VS.85).aspx 。在 Vista 之前的 Windows 中,這個鍵值僅用來決定文件屬性對話框提供的屬性字段以及這種文件類型可選的默認設置(如文件圖標)。Content Type 用來標識該文件類型對應的 MIME 內容類型。OpenWithList (如果存有)和 OpenWithProgIds 都是用來輔助決定文件打開方式對話框中顯示的程序列表的。不同之處在於,OpenWithList 子鍵下面存放的是應用程序子鍵,而 OpenWithProgIds 下面存放的是用於這種文件類型的可選 ProgID,對應於這些 ProgID 的程序也會顯示在打開方式對話框中,而且,如果有程序取得了這種文件類型的所有權,即修改了默認鍵值 @,它就必須被添加進這個 OpenWithProgIds 子鍵。因此,在筆者卸載 KMPlayer 之前,它對應的 ProgID 一定出現在這個子鍵下面。當然,細心的你會發現,這裏的項目會少於打開方式對話框中的程序列表。原因是,這個不是決定打開方式程序列表顯示什麼程序的唯一因素,由於超出本文範圍不再延伸討論。更多關於文件類型註冊的細節,有興趣的你可以閱讀這篇 MSDN 文章-- http://msdn.microsoft.com/en-us/library/cc144148(V S.85).aspx 。 既然是 digging into,我就要繼續爲大家介紹 PersistentHandler 了。Persistent handlers 是與搜索文件具體內容相關的,如果某種文件類型下面有 PersistentHandler,那麼它將告訴 Windows "請搜索此種類型文件所包含的具體內容"或者"請不要搜索此種類型文件所包含的具體內容"。我們知道,對於一些二進制文件,我們就應該不讓 Windows 搜索其具體內容,這些二進制文件包括媒體文件或者加密的文檔等等,因爲如果搜索,那麼搜索結果可能包含一些不相關的或者您不可讀的內容。很簡單,當視頻文件以文本的形式展現在您面前的時候,沒人知道這是個什麼視頻,我們必須使用播放器去解析它來觀看。而我們這些媒體文件大多數會要求 Windows 不要搜索內容,因此,默認地會定義 null persistent handlers。就像本例中,我們觀察上面的表格發現,asf 文件在正常情況下,其 PersistentHandler 子鍵下面是有一個鍵值爲 {098f2470-bae0-11cd-b579-08002b30bfeb} 的默認鍵(@)的,這個 GUID 對應的就是 null persistent handler。(上下文中的 GUID 都是可以在註冊表 HKEY_CLASSES_ROOT\CLSID 區域找到對應關係的) 接下來還要介紹一個 ShellEx。對於這些 Windows 默認支持的媒體文件,此鍵下面一般還有兩個子鍵,分別是 {BB2E617C-0920-11D1-9A0B-00C04FC2D6C1} 和 {e357fccd-a995-4576-b01f-234630154e96}。這裏的兩個 GUID 是系統提供的文件屬性 handler,在 HKEY_CLASSES_ROOT\CLSID 區域不可查。系統會爲程序員提供一些默認的常見文件格式對應的 property handlers。ShellEx 下面保存的都是 shell extension handlers,它們是一些與 Shell擴展功能相關的屬性的具體描述。這兩個以 GUID 命名的子鍵,其前者使用的是 OLEDoc 文件的 property handler GUID,OLEDOC 文件會在文件屬性對話框的詳細信息選項.Windows 7 視頻文件縮略圖 .卡中提供一些諸如標題、備註、版權之類的字段(這裏只是舉個例子,其實它的作用還有很多,例如與 Windows Search 有關);後者使用的是 thumbnail handler Shell extension GUID,也就是縮略圖處理程序外殼擴展GUID,它自身的缺失以及其下默認鍵鍵值的缺失纔是真正與縮略圖不顯示有關的根本原因!我們還可以發現,在正常情形下,這兩個以 GUID 命名的 ShellEx 子鍵下面都還有一個默認鍵,鍵值爲 {9DBD2C50-62AD-11D0-B806-00C04FD706EC},通過搜索註冊表 HKEY_CLASSES_ROOT\CLSID 區域我們發現這是一個 Property Thumbnail Handler。

  如果您是一個程序員或是一位對上述提到的各種 Handlers 的實現原理感興趣的 IT 專業人士,相信您會對以下四篇 MSDN 文章感興趣:

  Property System - http://msdn.microsoft.com/en-us/library/bb776859(v =VS.85).aspx

  Property Handlers - http://msdn.microsoft.com/en-us/library/bb776861(v =VS.85).aspx

  Thumbnail Handlers - http://msdn.microsoft.com/en-us/library/cc144118(V S.85).aspx

  Creating Shell Extension Handlers - http://msdn.microsoft.com/en-us/library/cc144067(V S.85).aspx

  通過以上說明,相信您已經理解,對於本案例我們所要修復的直接內容只有一個--添加 HKEY_CLASSES_ROOT\<媒體文件擴展名|如.asf > \ShellEx\{e357fccd-a995-4576-b01f-234630154e96} 鍵,並將其下的默認鍵值設爲 {9DBD2C50-62AD-11D0-B806-00C04FD706EC} 即可。添加之後,我們只需結束 explorer 進程,然後重新啓動 explorer 進程即可看見效果--視頻文件的縮略圖都回來啦:

  考慮到您可能沒有時間在註冊表編輯器內一項項地去添加,筆者爲您提供了快速修復方案-- .reg 文件,您只需下載並雙擊導入即可。

  筆者爲您提供的文件共有兩個,一個叫 WMP_MediaFiles_Thumbnails_Solution.reg,它用來單純地修復這個案例中所闡述的視頻文件縮略圖不顯示的問題,但需要提醒您注意的是,在這個文件中,我沒有使用嚴格意義的最小修復原則,我將 ShellEx 下的兩個以 GUID 命名的子鍵都添加進去了,除了修復縮略圖問題,也可以順便修復 OLEDoc 文件的 property handler 設置,因爲在筆者自己遇到的問題中,發現這個設置也是空缺的(詳見上文中的比對錶格);另一個提供的文件,則是裝好 Windows 7 後,一切默認媒體文件在註冊表中的擴展名項目默認設置,叫做 WMP_FileTypes_Defaults.reg,它包含了音頻、視頻文件的默認設置,因此當然包含能夠顯示縮略圖的視頻文件的一些設置。這些設置包括以媒體文件擴展名(如 .wmv)命名的註冊表項目及其下面的一切子鍵。建議使用第三方媒體播放器關聯一些常見媒體文件類型的用戶不要使用這個文件導入修復,而是使用第一個文件修復,因爲使用這第二種文件修復時,必將覆蓋您的文件類型默認所有權設置(上文提到過),例如 @="KMPlayer.asf" 就會被覆蓋爲 @=" WMP11.AssocFile.ASF "。當然,還有一點值得說明的是,不論是哪個文件,都只修復 Windows 默認支持的媒體文件類型,例如 Windows Media Player 和 Windows Media Center 原生能夠播放的文件類型;而且,文件 WMP_MediaFiles_Thumbnails_Solution.reg 只修復一些本應能夠顯示縮略圖的視頻文件,而 WMP_FileTypes_Defaults.reg 則相當於重置一切默認支持的音頻和視頻文件的設置(但不會刪除一些第三方播放器留下的冗餘鍵值)。

  這兩個文件的下載地址爲: http://cid-3222d068881c5251.office.live.com/embedi con.aspx/.Public/Windows%207%20%e8%a7%86%e9%a2%91%e 6%96%87%e4%bb%b6%e7%bc%a9%e7%95%a5%e5%9b%be%e8%a7%a 3%e5%86%b3%e6%96%b9%e6%a1%88

  如果您覺得上述文件存有不完美的地方,例如您希望使用 WMP_MediaFiles_Thumbnails_Solution.reg 實現真正的最小修復,請用記事本編輯它,刪除每個文件擴展名設置下面的這兩行(以 .3g2 文件爲例):

  [HKEY_CLASSES_ROOT\.3g2\shellex\{BB2E617C-0920-11d 1-9A0B-00C04FC2D6C1}]

  @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}"

  刪除前後的對比應該是這樣(同樣以 .3g2 這個格式的設置爲例): 說明 代碼 刪除前的代碼 [HKEY_CLASSES_ROOT\.3g2] [HKEY_CLASSES_ROOT\.3g2\shellex] [HKEY_CLASSES_ROOT\.3g2\shellex\{BB2E617C-0920-11d 1-9A0B-00C04FC2D6C1}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" [HKEY_CLASSES_ROOT\.3g2\shellex\{E357FCCD-A995-457 6-B01F-234630154E96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" 刪除後的代碼 [HKEY_CLASSES_ROOT\.3g2] [HKEY_CLASSES_ROOT\.3g2\shellex] [HKEY_CLASSES_ROOT\.3g2\shellex\{E357FCCD-A995-457 6-B01F-234630154E96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" 等效最簡代碼(同刪除後效果一致) [HKEY_CLASSES_ROOT\.3g2\ShellEx\{e357fccd-a995-457 6-b01f-234630154e96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" 如果您希望使用 WMP_FileTypes_Defaults.reg 完全恢復默認設置,包括刪除第三方播放器留下的冗餘設置和由於 Windows 的使用而產生的設置變更,請用記事本編輯它,在每個文件擴展名設置的首行前面添加下面的這行(以 .3gp文件爲例):

  [-HKEY_CLASSES_ROOT\.3gp]

  添加前後的對比應該是這樣(同樣以 .3gp 這個格式的設置爲例): 說明 代碼 添加前的代碼 [HKEY_CLASSES_ROOT\.3gp] @="WMP11.AssocFile.3GP" "PerceivedType"="video" "Content Type"="video/3gpp" [HKEY_CLASSES_ROOT\.3gp\OpenWithProgIds] "WMP11.AssocFile.3GP"=hex(0): [HKEY_CLASSES_ROOT\.3gp\ShellEx] [HKEY_CLASSES_ROOT\.3gp\ShellEx\{BB2E617C-0920-11D 1-9A0B-00C04FC2D6C1}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" [HKEY_CLASSES_ROOT\.3gp\ShellEx\{e357fccd-a995-457 6-b01f-234630154e96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" 添加後的代碼 [-HKEY_CLASSES_ROOT\.3gp] [HKEY_CLASSES_ROOT\.3gp] @="WMP11.AssocFile.3GP" "PerceivedType"="video" "Content Type"="video/3gpp" [HKEY_CLASSES_ROOT\.3gp\OpenWithProgIds] "WMP11.AssocFile.3GP"=hex(0): [HKEY_CLASSES_ROOT\.3gp\ShellEx] [HKEY_CLASSES_ROOT\.3gp\ShellEx\{BB2E617C-0920-11D 1-9A0B-00C04FC2D6C1}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}" [HKEY_CLASSES_ROOT\.3gp\ShellEx\{e357fccd-a995-457 6-b01f-234630154e96}] @="{9DBD2C50-62AD-11D0-B806-00C04FD706EC}"

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章