注册表修改文件关联(默认程序)

由于各种原因(主要是安全方面考虑),Windows 中修改文件关联的 Api 一改再改,改了又改。

而直接修改注册表 + 刷新 Explorer 的方法,也许是比较方便的能兼容各个 Windows 版本(NT6+)的方案(也许需要管理员权限)。

Code

[-HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}]

[HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}]

[HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}\DefaultIcon]
@="{{IconFile}},{{IconIndex}}"

[HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}\shell]

[HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}\shell\open]

[HKEY_CURRENT_USER\Software\Classes\{{AppName}}.{{Extension}}\shell\open\command]
@="\"{{AppPath}}\" \"%1\""

[HKEY_CURRENT_USER\Software\Classes\.{{Extension}}]
@="{{AppName}}.{{Extension}}"

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.{{Extension}}]
"Progid"="{{AppName}}.{{Extension}}"

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.{{Extension}}\OpenWithProgids]
"{{AppName}}.{{Extension}}"=hex(0):

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.{{Extension}}\UserChoice]
"Progid"="{{AppName}}.{{Extension}}"

示例:用 NodeJs 生成注册表文件

const fs = require("fs");
const template = fs.readFileSync("template.txt").toString();
const exts = "mp3 mp4 m4a avi mkv flv";
const appName = "PotPlayerMini";
const appPath = "D:\\\\PotPlayer\\\\PotPlayerMini.exe"; // Need 4 '\\'
const iconIndex = "0";
let output = "";
for (const ext of exts.split(" ")) {
  output += template
    .replaceAll("{{AppName}}", appName)
    .replaceAll("{{AppPath}}", appPath)
    .replaceAll("{{Extension}}", ext)
    .replaceAll("{{IconFile}}", appPath)
    .replaceAll("{{IconIndex}}", iconIndex);
}
fs.writeFileSync(`output_${Date.now()}.reg`, output);