惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
博客园_首页
美团技术团队
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
J
Java Code Geeks
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
雷峰网
雷峰网
爱范儿
爱范儿

kkocdko's blog

Tasker 永久试用修改思路 - kkocdko's blog 极限压缩文档扫描件 - kkocdko's blog Bypass the Blank Chars Detection crknob - Chrome portable patch 我如何将博客首页体积降至 3 KB - kkocdko's blog 如何极限优化压缩文件体积 - kkocdko's blog EmEditor 精简版 - kkocdko's blog Backup Data from VSCode Web 优雅地游玩 Minecraft - kkocdko's blog 让程序以管理员权限运行的 PE 清单 - kkocdko's blog 注销 ZEIT 账号之后遇到的坑 - kkocdko's blog 本博客的协议已更改为 CC0 - kkocdko's blog mobp - 使 MSOffice 后台常驻 在安装 VS 生成工具时规避 .NET 安装错误 各种格式的占位空文件 - kkocdko's blog 优雅地游玩 Flash 游戏 - kkocdko's blog WPS 2016 极限精简版 - kkocdko's blog Convert Const to Let by Terser 规避 Visual Studio 许可证过期的 Bug 方便地使用 iPod - kkocdko's blog 用 UserJS 注入 UserCSS - kkocdko's blog 周期精准的太阳系模型 - kkocdko's blog 关闭屏幕的 WinAPI - kkocdko's blog 重置 Windows 图标缓存 - kkocdko's blog AIDA64 极限精简单文件版 - kkocdko's blog 几何画板单文件精简版 - kkocdko's blog 世界之窗浏览器单文件版 - kkocdko's blog 在 MBR + Legacy 下用 Bootmgr 引导 Ubuntu 简洁的 Markdown 预览工具 - kkocdko's blog 修复 MSOffice 墨迹不可用问题 - kkocdko's blog
注册表修改文件关联(默认程序) - kkocdko's blog
2026-04-11 · via kkocdko's blog

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

由于各种原因(主要是安全方面考虑),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);