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

目录
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
110 9
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
113 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
52 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
85 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾