如何优雅地给Windows程序添加文件类型关联

在Windows上,有时某些没有添加关联项的应用(比如Okular)或者无需安装的绿色应用,如果要关联到某种文件类型,用Windows自带的打开方式->选择其他应用->选择应用后点始终虽然可以关联,但实现非常丑陋。

比如,不能显示正确的应用名(而是okular.exe这种文件名),没有清晰好看的文件类型图标(而是设定为应用图标),无法针对多种文件类型分开设置等等。

其实这些都是可以实现的,下面就以Okular为例来实现一遍。

准备工作

首先要做一些准备工作。

  1. 应用程序位置。需要应用程序的完整路径,如果是绿色应用在Windows 11上可以直接在应用的exe上点右键->复制文件地址,或者用文件资源管理器找到目录,然后复制地址栏里的路径再加上\<应用文件名.exe>。如果是安装到系统里的应用,在开始菜单里有快捷方式,可以在开始菜单里找到,然后点右键->打开文件位置找到快捷方式,然后再快捷方式上点右键->属性,弹出对话框中目标就是程序的位置。

    Okular的应用程序位置是C:\Program Files\Okular\bin\okular.exe

  2. 应用程序图标位置。一般情况下,应用程序图标就在应用程序本身的exe文件里,有的应用程序本身没有图标的需要找到图标位置。如果是安装的应用,可以按上一条的方法打开快捷方式的属性对话框,然后在更改图标打开的对话框里就可以看到图标的文件地址了,还要记住图标是第几个,按从上到下,再从左到右的顺序数,第一个是0,第二是1,以此类推。

    Okular的应用图标位置是C:\Program Files\Okular\bin\okular.exe,序号是0

  3. 文件类型图标。有的应用自带文件类型图标,可能在应用本身的文件里。如果没有,就需要另外找一个图标。推荐https://icon-icons.com/,直接搜索找到后,下载为ICO文件,保存到合适的地方备用。

    我下载了PDF文件图标,保存为D:\icons\pdf.ico

  4. 应用程序打开文件参数。大多数引用直接用<应用文件名.exe> <文件路径>这样的方式打开文件即可,但也有特殊的需要加参数<应用文件名.exe> -o <文件路径>,这些需要研究清楚。

    Okular的打开文件参数就是okular.exe <文件路径>

添加注册表项

所有的操作都是在注册表里完成的,在开始按钮上点右键->运行、或者直接按Win+R打开运行对话框,输入regedit确定,打开注册表编辑器。

注册表编辑器分为两块,左侧是用于浏览项(类似文件系统里的目录),右侧是当前项下的键值对(类似文件系统里的文件)。

所有项目都是在计算机\HKEY_CLASSES_ROOT\项下编辑或修改。

应用关联项

我们需要给每个文件类型都新建一个关联项,关联项的名称不要和其他应用混淆就行,最好能体现出所关联的文件类型。比如我给Okular关联PDF的项命名为KDE.Okular.PDF

关联项

在左侧找到计算机\HKEY_CLASSES_ROOT项,在其上点右键->新建->,命名为KDE.Okular.PDF

在左侧找到新建的计算机\HKEY_CLASSES_ROOT\KDE.Okular.PDF项,在其下新建三个项分别命名为ApplicationDefaultIconshell。在右侧双击(默认)键来修改值,内容就是文件类型的描述,比如Okular PDF Document。还可以在右侧点右键->新建->DWORD (32位)值,命令为EditFlag,然后设置一些值(见下方);还可以新建字符串值,命名为FriendlyTypeName,然后设置为文件类型描述(和默认类似)。但一般情况下可以不用设置,不影响使用。

以下是常见的位标志(这些标志可以组合使用):
0x00000001 (1):禁止编辑文件类型的描述。
0x00000002 (2):禁止编辑该文件类型的图标。
0x00000004 (4):禁止编辑该文件类型的关联程序(即“打开方式”)。
0x00000008 (8):禁止删除该文件类型的关联。
0x00000010 (16): 禁止新建该文件类型的关联(通常用于协议处理程序)。
0x00000020 (32):将该文件类型显示在“高级”设置中(在旧版文件类型对话框中)。
0x00000040 (64):不显示该文件类型的扩展名。
0x00000080 (128): 禁止在“打开方式”对话框中显示该文件类型。
0x00000100 (256):禁止使用“始终使用选择的程序打开这种文件”复选框(在“打开方式”对话框中)。
0x00000200 (512): 该文件类型是一个协议(如HTTP、FTP),而不是普通文件。
0x00000400 (1024):禁止在“文件类型”选项卡中显示该文件类型(隐藏)。
0x00000800 (2048):禁止在“新建”菜单中显示该文件类型(例如,右键菜单中的“新建”)。
0x00010000 (65536):禁止编辑与该文件类型关联的动词(例如“打开”、“编辑”等命令)。
0x00020000 (131072):禁止编辑与该文件类型关联的MIME类型。
0x00040000 (262144):禁止在“打开方式”菜单中显示“推荐的程序”和“其他程序”之间的分隔线。

Application项

Application项是应用的信息,在右侧新建一些字符串值来添加相应的信息(如下)。当然,不设置也完全不影响使用。

  • ApplicationCompany:应用的开发公司,如KDE
  • ApplicationDescription:应用的描述,如The Universal Document Viewer
  • ApplicationIcon:应用的图标,就是我们上面找到的图标位置,在后面加上逗号,分隔的图标序号,如"C:\Program Files\Okular\bin\okular.exe",0(路径加上双引号防止有特殊字符);
  • ApplicationName:应用的名称,如Okular
  • AppUserModelId:应用的表示符,用于和其他应用区分,如KDE.Okular

DefaultIcon项

DefaultIcon项是设置文件类型图标的,直接双击右侧(默认)修改值为上面的文件类型图标,同样要在后面加上逗号,分隔的图标序号,如"D:\icons\pdf.ico",0

shell项

shell项用于设置应用启动参数。在其下可以新建一些对应操作的项(如下)。

  • open:这是最常用的命令,表示默认的打开操作。当用户双击文件或选择“打开”时,执行的就是这个命令。
  • runas:表示以管理员身份运行。如果存在这个项,用户可以在右键菜单中看到“以管理员身份运行”的选项。选择后,系统会提示用户提升权限。
  • edit:通常用于打开文件进行编辑。例如,对于文本文件,edit命令可能用记事本或其他文本编辑器打开文件。
  • print:执行打印操作。选择此命令会将文件发送到默认打印机(或指定的打印程序)。

在这些项下,可以新建command项用于设置具体的执行命令和参数。

比如Okular PDF的open项下的command项,在右侧设置(默认)的值为"C:\Program Files\Okular\bin\okular.exe" "%1"%1会在双击打开文件时设置为文件路径。

如果我想给Okular PDF增加打印功能,就在shell下新建print项,再在print项下新建command项,在右侧设置(默认)的值为"C:\Program Files\Okular\bin\okular.exe" --print "%1"--print是Okular打开打印对话框的参数(不同应用参数不同,请不要套用)。

注意路径最好加上双引号以防有特殊字符。另外,如果参数中可能出现特殊字符,也最好加上双引号。

关联到PDF类型

还是在计算机\HKEY_CLASSES_ROOT下,找到.pdf项,在其下有很多子项,这里我们要修改的是OpenWithProgids,点击选中后,在右侧新建一个字符串值,命名为上面我们给关联项设置的名称,如KDE.Okular.PDF。到这里注册表有关的操作就完成了。

然后我们找到一个PDF文件,在其上点右键->打开方式->选择其他应用,就可以看到我们添加的Okular了,选择之后点始终,就可以关联上了。当然,去系统设置里设置也是一样的效果。

一个应用关联多种文件类型

比如Okular还可以用于打开EPS文件,那我们只要按上述方法,再新建一个关联项,命名为KDE.Okular.EPS,然后对应修改相关内容(比如图标、文件类型描述等,应用程序信息可以保持一致),然后关联到.eps文件类型即可。

使用注册表文件来设置

我们可以用注册表文件来一次性完成上面的工作,新建一个文本文件,修改文件扩展名为.reg。编写好后双击添加到注册表。

比如针对Okular就编写如下内容:

Windows Registry Editor Version 5.00

;关联项
[HKEY_CLASSES_ROOT\KDE.Okular.PDF]
@="Okular PDF Document"
"EditFlag"=dword:00000002
"FriendlyTypeName"="Okular PDF Document"

;应用信息
[HKEY_CLASSES_ROOT\KDE.Okular.PDF\Application]
"ApplicationCompany"="KDE"
"ApplicationDescription"="The Universal Document Viewer"
"ApplicationName"="Okular"
"ApplicationIcon"="\"C:\\Program Files\\Okular\\bin\\okular.exe\",0"
"AppUserModelId"="KDE.Okular"

;文件类型图标
[HKEY_CLASSES_ROOT\KDE.Okular.PDF\DefaultIcon]
@="\"D:\\softwares\\icons\\applicationpdf_103614.ico\",0"

;命令项
[HKEY_CLASSES_ROOT\KDE.Okular.PDF\shell]

;打开命令
[HKEY_CLASSES_ROOT\KDE.Okular.PDF\shell\open]

[HKEY_CLASSES_ROOT\KDE.Okular.PDF\shell\open\command]
@="\"C:\\Program Files\\Okular\\bin\\okular.exe\" \"%1\""

;打印命令
[HKEY_CLASSES_ROOT\KDE.Okular.PDF\shell\print]

[HKEY_CLASSES_ROOT\KDE.Okular.PDF\shell\print\command]
@="\"C:\\Program Files\\Okular\\bin\\okular.exe\" --print \"%1\""

;PDF关联
[HKEY_CLASSES_ROOT\.pdf\OpenWithProgids]
"Kde.Okular.PDF"=""

解释:
[]包裹的是项;
项下是以=分隔的键值对,=左边是名称,右边是数据;
名称@表示项下面的(默认)键值,如果是其他名称需要用双引号""包裹;
数据字符串值直接用双引号""包裹,如果数据内容中出现双引号",需要表示为\"以和外面的双引号区分;同样的,因为反斜杠\有了特殊含义,所以内容中的也要表示为\\以示区分;
DWROD值在等号后加dword:,后跟8位十六进制数。

删除关联

对照着上面的操作把添加的东西删除即可。

或者修改上面的注册表文件,需要删除的键值把=右侧设置为-即可;需要删除的项在[]内最前面加上-即可。如:

Windows Registry Editor Version 5.00

;关联项
[-HKEY_CLASSES_ROOT\KDE.Okular.PDF]

;PDF关联
[HKEY_CLASSES_ROOT\.pdf\OpenWithProgids]
"Kde.Okular.PDF"=-
赞赏

微信赞赏支付宝赞赏