Windows 里如何做到同一個擴展名對應不同的 icon?

比如Visual Studio的解決方案文件,不同版本對應不同的icon。

今天又想起了這個問題。很早以前就發現這點了,但是一直不知道怎麼實現的,那正也沒知乎。

例如:


謝@余天升 邀請。

這東西我沒自己用過,不過聽人說起過。正規的術語叫 Icon Handler,屬於ShellEx handler的一部分。基本的原理是Shell32.dll 本身支持一組擴展插件。開發者可以自己在系統中註冊一個DLL,並實現 IPersistFile和IExtractIcon。

這裡Shell32.dll會做兩步:

  1. 初始化IPersistFile,並將需要顯示圖標的文件名傳入IPersistFile::Load()。這一步我們需要打開並分析文件內容確定.sln項目文件的版本號。
  2. 調用IExtractIcon。我們的handler 借這個機會返回我們期望的圖標路徑。

現在最大的問題是我找不到 MSDN 的範例。它只給了靜態圖標的例子。因為我也沒寫過,所以我很難給出所有的細節。好在Stackoverflow 上的神人指出 CodeProject 上有一篇非常不錯的文章討論了做法。鏈接參見:

http://www.codeproject.com/Articles/797/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens

參考:

ShellEx Handler:http://msdn.microsoft.com/en-us/library/cc144067%28v=VS.85%29.aspx

Icon Handler:http://msdn.microsoft.com/en-us/library/cc144122%28VS.85%29.aspx

IExtractIcon介面:http://msdn.microsoft.com/en-us/library/bb761854(v=vs.85).aspx

IPersistFile介面:http://msdn.microsoft.com/en-us/library/ms687223(v=vs.85).aspx

Stackoverflow的類似問題:http://stackoverflow.com/questions/681802/custom-icon-per-file-instance


似乎不行,但是你可以自己做插件來達到這一效果。tortoise系列的版本控制軟體和很多網盤客戶端都能在文件圖標右下角顯示一個小圖標,那麼相信高個大圖片直接覆蓋到文件原來的圖標上也不是問題。


推薦閱讀:

Visual Studio 2017 如何編譯 Visual Studio 2015 的項目?
如何卸載vs2015?
用什麼技術開發一個無依賴的windows桌面開發最為高效?
Visual Studio 是不是坑了一代人?為什麼?
Visual Studio 為什麼不提供整體卸載功能?

TAG:MicrosoftWindows | 編程 | C | MicrosoftVisualStudio |