WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)
前言:
本文是基本原理介绍和手动的操作。程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载。
今天在开发程序的时候,需要做后缀和程序的关联,所以写下详细的操作过程跟大家分享。有什么意见欢迎留言!
目标:我这次要自定义一个后缀名(.seve),并且自己开发一个负责打开这种后缀文件的程序(Opo.exe)。当双击后缀名为我自定义的文件时,自动运行我的程序(Opo.exe)。
概要原理:
对windows来说,双击一个文件时,windows会根据他注册表中的记载打开和当前文件后缀名关联的程序。如默认情况下:.txt关联的是NODEPAD.exe,.doc关联的是word。所以要进行关联,就是要做注册表的修改。修改注册表,可以通过手动方式,也可通过注册表编程实现。
那么注册表中是怎么把指定的后缀和指定的程序关联的?
我们用实例讲解,这里的系统是XP(WIN7系统的注册表和XP至少在这里用到的地方都是一样的),点击开始——运行,输入regedit(这个命令用了很久,但是我比较笨,后来才看出来其实就是register edit(注册表编辑)的简写)。
打开后可以看到几个“键”,我们关心的和后缀名相关的,他们在HKEY_CLASSES_ROOT下面。点开后,点编辑——查找,然后在查找栏中输入.txt就自动跳转到.txt所在的位置,大家在右边可以看到如下内容:
按顺序讲下这三个值:
1.(默认):在关联中最重要的一个值,决定了当前后缀的文件交给谁并且怎么处理,这里大家看到的内容是“txtfile”。其实这个.txt键只是相当于一个索引,该键中并没有实际的处理说明,而实际的处理都交给了另一个键,那个键的名字就是这里的“(默认)”给出的。(着急的童鞋现在就可以在注册表中搜txtfile键)
2Content Type:这里指定了这个文件内容是什么类型,这个值可以接受很多参数,这个参数的列表可以再MSDN中查找Content Type看到。这个值存在的意义是当系统要处理这个文件内容的时候,和这个后缀名关联在一起的程序会根据这个值决定如何打开并展现文件中的内容。
3.PerceivedType:这个值也是一个类型的标记。他的用处呢?举个例子大家就有感觉了,如果这个值的内容是video的时候。我们打开一些视频播放器,许多播放器第一次打开很可能会搜索电脑硬盘,寻找可以播放的文件并展现在“播放列表”中,而这个搜索过程就是根据这个值进行的。
下面跳转到负责真正处理和打开工作的键中,对于我们的例子.txt,这个处理键,上面已经说了,就是txtfile,找到该键,并且全部展开,可以看到如下内容:
PS:在关联后缀名和打开程序中,都是两个键成对工作的,比如这里的.txt和txtfile键。我们暂且称第一个是“后缀键”第二个是“处理键”。这样方便后面表达。
上面的图中,大家可以看到txt文件的处理键的层次内容。选中最顶层的txtfile看右边界面显示的内容:
1.(默认):这里是文件类型的说明,大家右击文件图标,选择属性的时候,在属性中的文件类型框中可以看到这个值。
2.EditFlags:标识这个文件的读写权限,比如是只读,还是可读写。。。等等,这个在文件属性里也能修改。
3.FriendlyTypeName:这个值是应用程序的友好名称(晕菜,什么是友好名称?这里先说下不友好名称是什么:应用程序的ID,没错,就是看也看不懂的那一串数字,所以你在这里看到的这个值已经很适合人脑去理解了,很友好!)。这个值其实就是说明这个处理键对应的应用程序是哪个,大家打开文件属性找一找,也能找到这个值的身影。不过记住,这个值可不是起决定作用。决定作用在子键中。
现在回到txtfile键层次图中:
可以看到这个处理键的直接子键有两个:1.DefaultIcon这一类文件的默认图标。2.Shell,存放了对这类文件进行实际操作时,执行的命令。
我们直接看重点:
shell键:
在这个键中,可以看到三个子键:open,print,printto,这里列出的可以执行的命令,其实和鼠标右击这个文件时候,弹出的菜单中的命令对应。我们关心的是打开操作,所以这里我们看下open键下的command里存的是什么:
默认键:%SystemRoot%\system32\NOTEPAD.EXE %1
看到木有?这里真正的指定了由谁来打开这种后缀的文件。这里是NOTEPAD.EXE。
和open键平行的建都是一些操作,大家感兴趣可以一个个打开研究研究。
实现关联
既然知道注册表中后缀和程序是怎么关联的,我们就也来关联一组。
后缀:opo
程序:Opo.exe
1.手动方式
我们先手动创建,之后再说程序实现,原理上都一样,只不过程序的比较帅,当然也比较高端(在某些应用场合)。
鼠标右击HKEY_CLASSES_ROOT,弹出菜单,选新建——项
1.后缀键
创建:然后会创建一个键,我们给它输入名字,这里的名字就是后缀名:.opo。
写值:选中该键,然后在右边的界面中双击(默认),弹出对话框,我们在值中输入处理键的名字:opofile。
后缀键完成!
2.处理键
创建:和上面一样,名字写成上面的键的(默认)值opofile
我们就是要关联打开应用,其他乱七八糟的东西我们先不关心,所以如下:
右击opofile,在opofile键下创建键shell,shell下创建键open(定义打开命令),open下创建子键command。
写值:选中command,然后双击右边的默认,在弹出框中的写入程序Opo.exe的位置后面加上%1,我的是这样的:
测试:
现在随便找个小程序,名字改成Opo.exe,然后自己创建一个文本文件,重命名成后缀为opo的文件。然后双击这个文件,额。。。。
这就是所谓的后缀名和程序的关联,完成!嘿嘿
WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)的更多相关文章
- Linux关联文件扩展名和打开程序
手动为Linux关联文件扩展名与打开程序. 当Linux不认识某种扩展名的时候,需要为此扩展名创建一个MIME类型.Linux是依据MIME类型而不是扩展名来决定打开程序的. 再将此种MIME类型与某 ...
- Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例
1. 复制指定目录下指定后缀名的文件并修改名称的案例 需求:复制指定目录下的指定文件,并修改后缀名. • 指定的文件是:.java文件. • 指定的后缀名是:.jad • 指 ...
- Navicat查询哪些表有指定字段名
通常需要查询某个字段来自于哪张表,在navicat中没有直接查哪些表有指定字段名的功能,只能用sql来查. 1.(按字段名查表)查询哪些表有指定字段名(比如查字段名article_id)的SQL: S ...
- IO流-递归遍历目录下指定后缀名结尾的文件名称
/* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...
- C#中获取指定路径下指定后缀名的所有文件的路径的list
场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取 ...
- qt注册表关联文件格式
注册表相关知识:http://www.360doc.com/content/12/0812/19/3688062_229808059.shtml(超详细超实用) 将某种类型的格式关联到某个可执行程序, ...
- win2003、win7下操作注册表
在win2007里,web程序仅对LOCAL_CURRENT_USER能进行读(写:没有进行测试)操作. 在本地的IIS里运行的web程序,如需访问注册表,需要将对应的应用程序池中的标识里面的用户,改 ...
- Java 修改Windows注册表,以实现开机自启动应用程序。
使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...
- Windows删除指定时间之前指定后缀名的文件
时间判定标准:文件创建时间 实例:删除 D:\backup 目录下(包括子文件夹),7天前 “.bak”后缀名的文件及30天前后缀名为 “*.log” 的文件 批处理: @echo off echo ...
随机推荐
- addEventListener 第三个参数
addEventListener api target.addEventListener(type, listener[, options]); target.addEventListener(typ ...
- SQL列类型
列类型的几种基本规则 M:表示最大显示宽度,最大有效显示宽度255 D:适用于浮点和定点类型,表示小数点后面的位数 方括号: [],表示可选部分 如果为一个数值列指定ZEROFILL,MySQL自动为 ...
- Homebrew macOS 包管理
1.Homebrew 简介 1.1 Homebrew Homebrew 是一款 macOS 平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理, ...
- 如何永久删除git仓库中敏感文件的提交记录
如何永久删除git仓库中敏感文件的提交记录 参考: 1. https://help.github.com/articles/remove-sensitive-data/
- Ubuntu 13.10 解决虚拟机摄像头无法使用问题
前段时间使用的是Ubuntu 13.04,使用virtualbox虚拟机 4.2版,虚拟机里边装的Windows 7和Windows8.1均无法使用摄像头.只要在USB设备中选上了摄像头,虚拟机系统准 ...
- Atitit 医学之道 attilax总结
Atitit 医学之道 attilax总结 1. 相关的学科3 1.1. 口腔医学 ok3 1.2. 人体解剖学 ok3 1.3. 生理学 ok3 1.4. 病理学 ok3 1.5. 骨伤科学 ...
- 基于mindwave脑电波进行疲劳检测算法的设计(2)
上文讲到的是保证硬件的接通.接下来是用C语言在它提供的API接口进行连接. 在网盘中下载MindSet Development Tools这个开发包.这个目录下MindSet Development ...
- Oracle---常用SQL语法和数据对象
1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字 ...
- [译]我们为何基于FreeBSD打造解决方案?
[译注]翻译这篇文章,主要是觉得老外在思考问题时,勇于打破固有的技术栈积累,尝试不同的选择,从而找到最合适自己的技术方案.得到真正的实惠. Synergy SKY提供多种软件解决方案,本文想讨论的是关 ...
- 史上最详细的JavaScript事件使用指南
事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出来差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕获流. 事件冒泡 IE的事件流叫做事件冒泡 ...