Windows管理右键新建菜单的奥妙就在注册表的HKEY_CLASSES_ROOT中——在HKEY_CLASSES_ROOT下存在两种类型的项:一个是以文件扩展名项,另一个是类型项。这两个项包含了用于确定新建菜单所需的全部数据结构。其中文件扩展名项下的“ShellNew”子项为新建菜单提供了鼠标点击后行为的控制信息,类型项则提供了用于在新建菜单中显示的项名称。他们的实际工作原理,以.txt文件为例:
1、Windows Shell在初始化时会依次遍历HKEY_CLASSES_ROOT中所有以“.”开头的文件扩展名项;
2、对遍历到的每一项项时读取其的默认值,该值即为HKEY_CLASSES_ROOT中对应的类型项,[HKEY_CLASSES_ROOT\.txt]的默认值是txtfile;
3、并检索其中是否存在ShellNew子项,若存在且第二步中的默认值不为空则表示该扩展名的文件能够在Windows新建菜单中生成;
4、然后获取第二步中得到的类型项所对应的默认值,该值即为Windows新建菜单中显示的项名称,[HKEY_CLASSES_ROOT\txtfile]的默认值为Text Document(注:在中文版的Windows系统中,该值在最终显示时会被本地化模块转换为“文本文档”显示在新建菜单中)。
同时在ShellNew项中,注册表提供了以下几种字符串型的值:
值名 |
值内容 |
备注 |
command |
用鼠标点击新建菜单项时系统调用的可执行文件全路径 |
值的格式为:"E:\自产工具\会议纪要生成工具\ContextMenuMeettingRecordDoc.exe" "%1"。其中”%1”代表新建文件的全路径 |
iconpath |
用于显示在新建菜单上该项对应的图标的全路径 |
|
NullFile |
值为空,表示鼠标点击该新建菜单项后仅生成空文件 |
|
FileName |
用于生成新文件所需的文件模板文件的全路径 |
该值与NullFile互斥,同时如果ShellNew项下均不存在NullFile和FileName两值,则只创建新建文件名,而不会创建文件(包括空文件)。 |
待补充 |
写到这里,相信大家可以发现我们此时已经具备了在Windows右键新建菜单中创建自定义会议纪要文档的全部知识,那么下面就再介绍下该功能的实现过程,以使得大家对以上的知识有更直观的理解。
首先,在注册表HKEY_CLASSES_ROOT下创建项“.mr”和“MeettingRecordFile”,并将.mr的默认值设置为“MeettingRecordFile”,MeettingRecordFile项的默认值设置为“会议纪要文档”;
然后,在项.mr下新建子项“ShellNew”,接着在“ShellNew”下依次新建名为“command”和“iconpath”的字符串类型的值,其中“command”的值为“"E:\自产工具\会议纪要生成工具\ContextMenuMeettingRecordDoc.exe" "%1"”,“iconpath”的值为“C:\Windows\Installer\{20140000-0011-0000-0000-0000000FF1CE}\wordicon.exe,13”(注:该值是word2010的图标地址,大家可根据需要用其他图标)。
注意,因为会议纪要文档最终需要由E:\自产工具\会议纪要生成工具\ContextMenuMeettingRecordDoc.exe 工具生成,而新建菜单只需提供新建文件的文件名,而不用生成文件,故无需再ShellNew中新建字符串类型值“NullFile”或“FileName” 。
至此,在右键新建菜单中我们就可以看到“会议纪要文档”的项了,如下图:
最后,在程序ContextMenuMeettingRecordDoc.exe 的代码中,将其入口函数(本例是用C#Windows Form Application实现)由static void Main()该为static void Main(string[] args),其它代码不变,接着从通过args[0]获取到新建文件的全路径得到当前目录,之后就可以在该目录中按自定义命名规则生成的会议纪要文件了,下图为点击新建会议纪要文档后的功能展示图。
点击新建“会议纪要文档”后弹出的会议信息设置窗口
生成的会议纪要文件
生成的会议纪要文档内容