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示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"
SHChangeNotify函数可以使explorer.exe重新加载注册表设置,用户不用重新登录,新注册的文件类型就可以生效。使用如下参数调用SHChangeNotify:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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