天天看點

26、Windows API Shell程式設計(2)

二、檔案協助(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示例代碼:

26、Windows API Shell程式設計(2)
26、Windows API Shell程式設計(2)

.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:

26、Windows API Shell程式設計(2)
26、Windows API Shell程式設計(2)

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 函數、接口、程式設計執行個體

繼續閱讀