相信你们在开发中会遇到这样的需求:把某个后缀名的文件的默认打开软件换成自己的,还要换个自定义的图标。
这篇文章就是为了解决这个烦恼,从我自己的需求出发,给大家讲解如何在Windows系统下实现这个目标。
首先,咱们以后缀为.tst的文件为例子,来讲一讲如何为某种后缀的文件设置默认打开方式。
通过windows的两个命令我们可以达到这样的效果assoc
和ftype
。
通过这个命令,我们可以关联某个后缀文件的文件类型。我们先来看看,系统中是怎么进行关联的。如果对这个命令的具体内容感兴趣可以看微软的官方文档:assoc。
可以看到assoc
仅仅是将某一个后缀的文件,关联了一个文件类型。但是assoc
并没有设置默认打开的方式,这就引出了我们接下来要介绍的另外一个命令——ftype
通过这个命令我们可以设置某种文件类型的默认打开方式。同样,我们看看系统中是怎么进行设置的。对这个命令的具体内容感兴趣的可以看官方文档:ftype
在cmd中运行ftype
可以看到,这个就指定了某种文件类型应该使用哪一个软件打开,参数又是什么。
️ftype的格式如下:
ftype [
[=[ ]]]
以txtfile为例,我们设置默认打开软件为系统自带的Notepad
通过对上面两个命令的了解,以.tst
为例,我们可以给出一个设置某种后缀的默认打开方式:
assoc .tst=testfile
ftype testfile= "C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2305.18.0_x64__8wekyb3d8bbwe\Notepad" "TestFile" %1
️如果要将这些命令组合写进代码里,我们可以结合system
函数来解决(但是还有另外一种更加简便的方法,后面会介绍):
// assoc 改变文件的文件类型名
QString assocCommand = "assoc .tst=testfile";
int result = system(assocCommand.toLocal8Bit().data());
// ftype 修改文件类型名的默认打开方式
QString FilePath = "C:/Notepad.exe";
QString ftypeCommand(R"(ftype testfile="Path" "Testfile" %1)");
ftypeCommand.replace("Path", FilePath);
result = system(ftypeCommand.toLocal8Bit().data());
️ 传入命令行的参数,我们可以在main函数里,使用argv
来获取,也可以使用Qt的qApp->arguments()
来获取。
在我自己实现这个需求的时候,从网上搜到的设置文件图标的解决方法为修改注册表项中的值。以.pdf为例:
按下win + R, 输入regedit
打开注册表
修改该项下的DefaultIcon
,改为自己的图标
看到这里,可能就会有疑问了,这个PDF的Icon,竟然是"DLL, 13",那图标从哪里获取呢?难道从DLL中获取吗?
这里我们使用一个软件iconsext,来扣一下这个DLL的图标
可以看到,这一个DLL里面,带了很多的图标,而13则代表第13个Icon,而系统中显示的图标也确实是这个。
那么,接下来我们将为大家介绍如何为一个应用程序添加多个图标。
在上一篇博客中,我们讲到,可以通过添加资源文件的方式来为应用程序添加图标。我们采取同样的方式,为一个应用程序添加多个图标。
也可以自己手动修改.rc文件,然后生成应用程序
IDI_ICON1 ICON "D:\\Desktop\\logo.ico"
IDI_ICON2 ICON "D:\\Desktop\\favicon.ico"
添加完之后,使用之前的iconset来查看生成应用程序的icon列表。
再按照上面所说的改动icon的方法,将文件设置成我们想要的图标就好了。
读到这里,我们已经实现了我们想要的效果。然而,设置默认打开方式和默认图标的方法是不同的。一个是使用命令,另一个是修改注册表。这就让我们不得不写两种代码,非常的麻烦(技术人总想统一)。
细分的同学可能注意到了,前面介绍怎么修改默认图标时,在KWPS.FDF.9注册表项里,除了DefaultIcon
,还有另外一个项:shell
这就是修改打开方式的第二种方法:通过设置注册表项。通过修改shell/open/command
里的值,来设置默认的打开方式。
现在我们综合起来,使用Qt的QSettings
类,修改注册表,达到我们的目的:
QSettings settings("HKEY_CLASSES_ROOT\\", QSettings::NativeFormat);
// 判断是否存在.myext注册表项,存在则删除
if (settings.contains(".tst/.")) {
settings.remove(".tst");
}
if (settings.contains("testfile/.")) {
settings.remove("testfile");
}
settings.beginGroup(".tst");
settings.setValue(".", "testfile");
settings.endGroup();
settings.beginGroup("testfile");
settings.setValue(".", "Test File");
settings.beginGroup("DefaultIcon");
settings.setValue(".", "D:\\Desktop\\myexe.exe, 1");
settings.endGroup();
settings.beginGroup("shell");
settings.beginGroup("open");
settings.beginGroup("command");
settings.setValue(".", "D:\\Desktop\\myexe.exe");
settings.endGroup(); // End 'command' group
settings.endGroup(); // End 'open' group
settings.endGroup(); // End 'shell' group
settings.endGroup(); // End 'myapp' group
好了,读到这里,相信各位同学已经了解到如何为特定类型的文件设置默认打开方式以及默认的图标。希望这些知识对大家有所帮助。感谢大家的阅读和支持!送君千里,终有一别,下一篇文章我们再见!
创作不易,如果对您有帮助,点赞、关注、收藏支持一下!不甚感激!