引入
最近的一个需求,发现需要使用Qt修改注册表,觉得很有意思就发一篇博客吧~
QSettings类
对于类的学习我非常建议使用Assistant,qt的帮助文档给我们提供了非常强大的平台,看不惯英文的,下面有一个博主翻译过来的文章
Qt:QSettings类
设置程序
#if 0
首次启动程序,系统会给main函数传参,第一个参数为exe所在的路径
第二个路径默认是null,假设软件A.exe生成的.asm的工程文件已经存在
需要直接双击该.asm的文件并且自动由A.exe来打开,则main函数的第二个参数会更改为该.asm文件所在的路径,
告诉程序要打开的文件的路径,第一个参数还是exe所在的文件路径,此时exe所在的运行路径,
会变为.asm所在的路径,因此特别注意如果exe在启动时需要读取外部配置文件并且使用相对路径时,
应该注意需要添加QDir::setCurrent(伪代码::argv[0]),将exe的工作路径切换回来才能正确加载配置文件
#endif
#include "Shlobj.h" //Windows中刷新图标缓存的函数的头文件引入
QString appPath(QString(argv[0]).toStdString().c_str());
QString className("Myasm"); // 自定义的类别
QString ext(".asm"); // 关联的文件类型
QString extDes(" xxxxx工程文件"); // 该文件类型描述
//上述appPath就是exe所在的path
//className 设置为自己想要设置的Name一般是不能和别的值重复,这个值很重要
//ext中为自定义输出的文件的后缀名
//extDes为后缀名文件的描述,不是很重要,可以设置也可以不设置,
//以下可以自己封装一个函数
void func(QString appName,QString className,QString ext,QString extDes)
{
QString baseUrl("HKEY_CURRENT_USER\\Software\\Classes"); // 要添加的顶层目录
QSettings settingClasses(baseUrl, QSettings::NativeFormat);
settingClasses.setValue("/" + className + "/Shell/Open/Command/.", "\"" + appPath + "\" \"%1\"");
settingClasses.setValue("/" + className + "/.", extDes);
//这两种方式二选一,或者全配置也没关系
settingClasses.setValue("/" + className + "/DefaultIcon/.", appPath + ",0");//使用这个程序后的默认图标
settingClasses.setValue("/" + ext + "/DefaultIcon/.",iconPath + ",0");// 这个ext文件类型的关联图标
// 关联ext 和 类别
settingClasses.setValue("/" + ext + "/OpenWithProgIds/" + className, "");
// 立即保存该修改
settingClasses.sync();
}
//上述即完成了注册表的修改,至于传入asm文件的路径之后,main函数该怎么操作由用户自己定义,但一般情况是先构建工程文件运行时所需要的环境,环境构建好之后Open填充即可。
//上述步骤解决了注册表问题但是图标是没有缓存上去的,需要我们调用shell函数刷新图标缓存
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);//调用 SHChangeNotify 函数以通知 Shell 更新其图标缓存。
主程序测试
#include <QCoreApplication>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout << argc << endl;
for(int i = 0; i < argc; ++i)
cout << i + 1 << ": " << argv[i] << endl;
return a.exec();
}
参考
QT笔记- Windows环境下设置自定义类型文件的默认打开方式——通过QSettings类修改注册表