首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

26、Windows API Shell编程(2)

作者:  时间: 2011-02-19

    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,还可以设置其他键值或子键。包括PerceivedTypeContent Type键值和penWithProgidsOpenWithList子键等。

OpenWithListOpenWithProgids子键分别设置了“打开方式”列表和“打开方式”-“选择程序”对话框中可选的项。

3)可编程标识符

ProgID有多种子键:DefaultIconCurVershellshellex等,还具有多种键值InfoTipFriendlyTypeName等。

ProgID的默认键值指定了文件类型的描述;InfoTip键值指定了用户将鼠标指针移动到该种类型的文件时,所弹出的提示信息。

DefaultIcon子键指定了该种文件类型的默认图标。CurVer指明了当前版本。

shell子键包括若干的命令处理程序(Handler),有一些默认Handleropenplay等)也可以注册自定义的Handler

shellex中包括若干Shell扩展的Handler,用于新加右键菜单项、文件拖曳菜单、图标、属性对话框、提示对话框等,包括Context Menu handlerData handlerDrop handlerIcon handlerProperty sheet handlerInfotip handlerCopy 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