如何在Windows 10.x上通过C注册表API注册.dart文件扩展名以关联dcli工具
你的核心需求是让Windows命令行中输入.dart脚本名时,自动调用dcli.bat并传递所有参数,同时处理VSCode已存在的文件关联问题。我来帮你梳理正确的注册表配置步骤,以及澄清HKEY_CLASSES_ROOT的困惑。
一、正确的注册表项配置(当前用户范围,无需管理员权限)
你之前的配置有个关键错误:dcli\shell\open\command的路径不对,应该挂在你创建的ProgID(noojee.dcli)下面。以下是修正后的完整步骤:
1. 创建ProgID并定义其行为
首先为dcli创建专属的ProgID,这是文件关联的核心标识:
// 创建ProgID 'noojee.dcli',设置默认值为友好名称 regSetString(HKEY_CURRENT_USER, r'\Software\Classes\noojee.dcli', defaultRegistryValueName, 'dcli Dart Script Runner'); // 配置ProgID的执行命令:用%*传递所有命令行参数,替代%1-%9的局限 regSetExpandString( HKEY_CURRENT_USER, r'\Software\Classes\noojee.dcli\shell\open\command', defaultRegistryValueName, r'"C:\path\to\dcli.bat" "%1" %*' );
注意:用
"%1"包裹脚本路径(避免带空格的路径出问题),%*会传递除了%1之外的所有参数,完美匹配你的需求。
2. 将.dart扩展名关联到ProgID
把.dart后缀指向我们的ProgID,同时处理OpenWithProgids确保关联生效:
// 设置.dart扩展名的默认ProgID regSetString(HKEY_CURRENT_USER, r'\Software\Classes\.dart', defaultRegistryValueName, 'noojee.dcli'); // 在OpenWithProgids中添加我们的ProgID(这是Windows识别可选打开方式的关键) regSetString(HKEY_CURRENT_USER, r'\Software\Classes\.dart\OpenWithProgids', 'noojee.dcli', '');
3. 更新Explorer的文件关联缓存(可选但推荐)
如果要让资源管理器立即看到新的关联,可以更新这几个项,不过即使不设置,重启Explorer后也会生效:
// 将dcli添加到OpenWithList作为可选选项 regSetString( HKEY_CURRENT_USER, r'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart\OpenWithList', 'a', 'dcli.bat' ); // 设置MRUList让dcli出现在最近打开方式的前列 regSetString( HKEY_CURRENT_USER, r'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart', 'MRUList', 'a' ); // 在OpenWithProgids中注册我们的ProgID,确保它出现在右键"打开方式"菜单 regSetNone( HKEY_CURRENT_USER, r'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dart\OpenWithProgids', 'noojee.dcli' );
二、澄清HKEY_CLASSES_ROOT的困惑
HKEY_CLASSES_ROOT(简称HKCR)并不是一个真实的注册表 hive,它是HKEY_LOCAL_MACHINE\Software\Classes(系统级配置)和HKEY_CURRENT_USER\Software\Classes(用户级配置)的合并视图:
- 读取时,优先返回用户级的配置(如果存在),否则返回系统级。
- 写入时,默认会写到HKLM\Software\Classes,但这需要管理员权限。所以你的场景更适合用HKCU\Software\Classes,这样普通用户就能完成配置,不需要提权。
三、覆盖VSCode的.dart关联问题
VSCode的Dart-Code扩展会在HKLM或HKCU下添加自己的ProgID(比如DartCode.dart)关联到.dart文件。要让我们的dcli成为默认打开方式,只需要确保我们在HKCU下的.dart默认值(指向noojee.dcli)优先级高于VSCode的配置——因为用户级配置会覆盖系统级,也会覆盖其他用户级的旧配置。
另外,通过我们上面配置的OpenWithProgids和OpenWithList,dcli会出现在右键菜单的"打开方式"列表中,用户可以随时选择用dcli或VSCode打开.dart文件。
四、验证配置是否生效
- 打开命令提示符,输入
hellow.dart a b c,应该会自动调用dcli.bat hellow.dart a b c。 - 在资源管理器中右键点击.dart文件,应该能看到"dcli Dart Script Runner"作为打开选项,且如果设置了默认,双击会直接用dcli执行。
内容的提问来源于stack exchange,提问作者Brett Sutton

