最近,项目中经常碰到需要先打开软件,然后再加载相应的工程文件这样的繁琐操作,为了更好的客户体验(主要是自己想偷懒
),遂决定添加文件关联,
文件关联:是将一种类型的文件与一个可以打开它的程序建立起一种依存关系。举个栗子来说,位图文件(BMP文件)在Windows中的默认关联程序是“图片”,如果将其默认关联改为用ACDSee程序来打开,那么ACDSee就成了它的默认关联程序。(转自 百度百科)
有了这个想法之后,立马付诸行动,首先想到的当然是百度相关代码并xx之,正所谓前人栽树后人乘凉嘛,然而可能是我使用的方法不对,抄来的代码总是达不到理想的效果,然后只能自己造了呗,仔细拜读前人代码,将主要的操作定位到注册表[]HKEY_CURRENT_USER\\Software\\Classes]这个位置处,打开注册表编辑器,找到对应的位置处:
如图:
随便下拉浏览了下内容,突然看到了熟悉的QtProject.QtCreator.xx之类的东西,看名字也大概能看出来,这不就是QtCreator相关文件的关联设置吗,于是随便点开查看,以UI文件为例,如下图
看起来也没什么啊,好像挺简单的,顾名思义,DefaultIcon就是默认图标,shell就是打开文件时的命令(源于之前的经验
),好像很简单啊,
于是就先照猫画虎,通过以下代码创建类别以及其子类相关数据:
待续...
这是最终代码:
/*******************************************************************
* 注册文件关联
*
* className // 自定义的类别
* appPath // 关联的程序目录
* ext // 关联的文件类型
* extDes // 该文件类型描述
*
*******************************************************************/
void registerFileRelation(const QString& className,const QString& appPath,const QString& ext,const QString& extDes)
{
QString baseUrl("HKEY_CURRENT_USER\\Software\\Classes"); // 要添加的顶层目录
QSettings settingClasses(baseUrl,QSettings::NativeFormat);
// 在...Classes\类别下创建一个新的类别,并设置该类别打开文件时的调用参数
settingClasses.setValue("/" + className + "/Shell/Open/Command/.","\"" + appPath + "\" \"%1\"");
// 文件类型描述
settingClasses.setValue("/" + className + "/.",extDes);
// 设置该类别的默认图标默认图标
settingClasses.setValue("/" + className + "/DefaultIcon/.",appPath + ",0");
// 关联ext 和 类别
settingClasses.setValue("/" + ext + "/OpenWithProgIds/" + className,"");
// 立即保存该修改
settingClasses.sync();
}
QString className("xxx.yyy.com"); // 自定义的类别
QString appPath("D:\\Program Files\\MyProgram.exe"); // 关联的程序目录
QString ext(".proj"); // 关联的文件类型
QString extDes("xx 工程文件"); // 该文件类型描述
registerFileRelation(className,appPath,ext,extDes)版权声明:本文为gnibuoz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。