二、檔案協助(File Associations)
File Associations可以指定Shell在顯示、處理特定檔案類型的檔案時的方式,包括如下幾個方面:
◇雙擊檔案時,哪個應用程式應該被用來開啟這個檔案;
◇檔案的表徵圖;
◇在Explorer中瀏覽時顯示的檔案類型等;
◇檔案的右鍵菜單中顯示的指令(功能表項目);
◇一些使用者介面細節,比如當滑鼠指標停留在表徵圖上時所彈出的提示信(Infotip)。
與File Associations相關的一個重要概念是“檔案類型”,每一種檔案類型對應特定的副檔名。為了使Shell (Explorer.exe)能夠正確識別檔案類型,需要在註冊表中進行相關的註冊。只有在註冊表中正確註冊了的檔案類型Shell才知道如何選擇檔案的表徵圖、如何指定雙擊檔案時開啟檔案所需的應用程式。
1、檔案類型相關註冊表索引值
1)檔案類型
具有同一種副檔名的檔案屬於同一個檔案類型。如果需要Shell識別這種檔案類型,需要在註冊表中註冊。註冊一個檔案類型包括兩個方面,一是在HKEY_CLASSES_ROOT設定副檔名子鍵,並將預設值設定為副檔名對應的ProgID (Programmatic Identifiers,可程式化標識符);二是在HKEY_CLASSES_ROOT索引值下建立ProgID子鍵,並設定相關屬性。
2)副檔名鍵
HKEY_CLASSES_ROOT的副檔名子鍵除了預設索引值應為ProgID,還可以設定其他索引值或子鍵。包括PerceivedType和Content Type索引值和penWithProgids和OpenWithList子鍵等。
OpenWithList和OpenWithProgids子鍵分別設定了“開啟檔案”列表和“開啟檔案”-“選擇程式”對話方塊中可選的項。
3)可程式化標識符
ProgID有多種子鍵:DefaultIcon、CurVer、shell、shellex等,還具有多種索引值InfoTip、FriendlyTypeName等。
ProgID的預設索引值指定了檔案類型的描述;InfoTip索引值指定了使用者將滑鼠指標移動到該種類型的檔案時,所彈出的提示資訊。
DefaultIcon子鍵指定了該種檔案類型的預設表徵圖。CurVer指明了目前的版本。
shell子鍵包括若干的命令處理常式(Handler),有一些預設Handler(open、play等)也可以註冊自訂的Handler。
shellex中包括若干Shell擴充的Handler,用於新加右鍵功能表項目、檔案拖曳菜單、表徵圖、屬性對話方塊、提示對話方塊等,包括Context Menu handler、Data handler、Drop handler、Icon handler、Property sheet handler、Infotip handler、Copy hook handler等類型。
2、為檔案指定預設開啟程式
通過註冊表可以為特定檔案類型的檔案指定預設開啟的程式。指定預設開啟程式後,在exploerer.exe中雙擊或選擇“右鍵一開啟”就可以開啟檔案。
如下reg範例程式碼:
.reg
REGEDIT4
[HKEY_CLASSES_ROOT\.win]
@="WINFile"
[HKEY_CLASSES_ROOT\WINFile]
@="File Type Example"
[HKEY_CLASSES_ROOT\WINFile\DefaultIcon]
@="shell32.dll,-152"
[HKEY_CLASSES_ROOT\WINFile\shell\open\command]
@ = "NOTEPAD.EXE %1"
通過以上方法。可以向Shell註冊一個新的檔案類型。但是直接修改註冊表索引值後,explorer.exe並不會立即關聯到新的設定。所以需要登出重新登入,以重啟explorer.exe。
SHChangeNotify函數可以使explorer.exe重新載入註冊表設定,使用者不用重新登入,新註冊的檔案類型就可以生效。使用如下參數調用SHChangeNotify:
SHChangeNotify
#include <Windows.h>
#include <shlobj.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WinExec("regedit win.reg", nCmdShow);
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
}
參考
[1] 精通Windows API 函數、介面、編程執行個體
[2] http://msdn.microsoft.com/en-us/library/bb773177%28VS.85%29.aspx