26、Windows API Shell编程(2)

简介: 二、文件协助(File Associations)     File Associations可以指定Shell在显示、处理特定文件类型的文件时的方式,包括如下几个方面: ◇双击文件时,哪个应用程序应该被用来打开这个文件; ◇文件的图标; ◇在Explorer中浏览时显示的文件类型等; ◇文件的右键菜单中显示的指令(菜单项); ◇一些用户界面细节,比如当鼠标指针停留在图标上时所弹出的提示信(Infotip)。

二、文件协助(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,还可以设置其他键值或子键。包括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示例代码:

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gif.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

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gifSHChangeNotify
 
   
#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

目录
相关文章
|
2月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
59 0
|
6天前
|
监控 Shell 开发工具
Shell编程
Shell编程
|
11天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
42 1
|
25天前
|
存储 Java Shell
bigdata-04-shell编程基础
bigdata-04-shell编程基础
12 0
|
28天前
|
Shell Linux C++
【Shell 编程设计】 编写自己的清理后台的Shell脚本
【Shell 编程设计】 编写自己的清理后台的Shell脚本
30 1
|
28天前
|
算法 Linux API
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
28 0
【Linux系统编程】一文了解 Linux目录的创建和删除API 创建、删除与读取
|
28天前
|
存储 Shell 数据安全/隐私保护
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
22 0
|
28天前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
28天前
|
Shell 程序员 Linux
【Shell 编程指南】shell运算操作符之(())
【Shell 编程指南】shell运算操作符之(())
19 0
|
1月前
|
Linux API C++
【Linux C/C++ 线程同步 】Linux API 读写锁的编程使用
【Linux C/C++ 线程同步 】Linux API 读写锁的编程使用
20 1