为Qt程序生成的自定义文件设置关联图标并设置默认打开方式

引入

最近的一个需求,发现需要使用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 
#include 
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类修改注册表

Qt为文件指定图标的思路

为Qt程序生成的自定义文件设置关联图标并设置默认打开方式


windows文档

如何将自定义图标分配给文件类型

SHChangeNotify function

你可能感兴趣的:(随笔,C++,qt,开发语言)