为给定的扩展创建上下文菜单条目
Create context-menu entries for a given extension
可以通过创建 Window 的 所有 文件的文件资源管理器创建上下文菜单条目,方法是创建注册表条目,例如
[HKEY_CLASSES_ROOT\*\shell\kdb-test]
@="Test (*,kdb-test)"
[HKEY_CLASSES_ROOT\*\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
也可以通过将 \* \
替换为 \.extension\
来为给定的扩展名创建它们。
但是,我发现后者不能可靠地工作。例如,
[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test]
@="Test (.regshelltest,kdb-test)"
[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
将按预期覆盖 *
的定义,但对 .pdf
或 .txt
执行相同的定义在我的系统上不起作用。
The documentation 建议使用间接结构作为干净的解决方案,
[HKEY_CLASSES_ROOT\.txt]
@="PlainTextFile"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test]
@="Test (PlainTextFile,kdb-test)"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
但这也不管用。此外,它降低了兼容性,因为它强烈假设定义此类注册表项的每个人都使用相同的文件类型名称作为扩展名(couter-example:.pdf 被设置为 PDFXChangeEdit.PDF
),因此根据扩展名定义操作会更可取——尤其是对于用户创建的 shell 扩展。
“Registry keys for context menu entries written, but no context menu entries”中讨论了类似的问题,但建议的解决方案是查询 "ProgID"(即由 HKEY_CLASSES_ROOT\.extension
键指定的文件名类型) ,这对我不起作用。
是否有一些可靠的方法可以根据文件扩展名创建这些上下文菜单条目,而不依赖于 ProgID
集?
作为解决方法,在“Add a Windows Shell context menu entry for a specific extension (not file type)”中,建议将 \*\
键与 AppliesTo
过滤器一起使用。然而,它确实感觉像是一种变通方法而不是一个干净的解决方案,所以我正在寻找一种干净可靠地使用 HKEY_CLASSES_ROOT\.extension\shell
接口的可能性。
Windows XP 添加了一种方法,可以在不依赖 prog-id 的情况下向文件扩展名添加补充动词; the HKEY_CLASSES_ROOT\SystemFileAssociations
key。您可以注册特定的扩展名或感知的文件类型(文本、视频等)。
将您的注册直接放在 .extension
键中是不可靠的,当扩展程序正常工作时它无法正常工作 prog-id。
当您想更改默认操作时,将注册放在 prog-id 中是正确的方法,并且它至少从 Windows 95 开始就以这种方式工作。改变了什么然而,时间是 prog-id 的确定方式。在某个时候,一个未记录的 Explorer 相关密钥开始控制 .extension 到 prog-id 映射的内容,并防止应用程序更改用户默认值,此信息现在是 "encrypted".
当前的指南是,对于您想成为默认动词的扩展,您可以以正常方式注册 prog-id 并将扩展指向此 prog-id。如果此扩展已被另一个 prog-id 占用,则用户必须手动更改默认值,您不能以编程方式更改。您可能想在 Default Programs 上注册自己,这样您的应用程序就会出现在控制面板的默认程序 UI 中。
可以通过创建 Window 的 所有 文件的文件资源管理器创建上下文菜单条目,方法是创建注册表条目,例如
[HKEY_CLASSES_ROOT\*\shell\kdb-test]
@="Test (*,kdb-test)"
[HKEY_CLASSES_ROOT\*\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
也可以通过将 \* \
替换为 \.extension\
来为给定的扩展名创建它们。
但是,我发现后者不能可靠地工作。例如,
[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test]
@="Test (.regshelltest,kdb-test)"
[HKEY_CLASSES_ROOT\.regshelltest\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
将按预期覆盖 *
的定义,但对 .pdf
或 .txt
执行相同的定义在我的系统上不起作用。
The documentation 建议使用间接结构作为干净的解决方案,
[HKEY_CLASSES_ROOT\.txt]
@="PlainTextFile"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test]
@="Test (PlainTextFile,kdb-test)"
[HKEY_CLASSES_ROOT\PlainTextFile\shell\kdb-test\command]
@="cmd.exe /c type %1 & pause"
但这也不管用。此外,它降低了兼容性,因为它强烈假设定义此类注册表项的每个人都使用相同的文件类型名称作为扩展名(couter-example:.pdf 被设置为 PDFXChangeEdit.PDF
),因此根据扩展名定义操作会更可取——尤其是对于用户创建的 shell 扩展。
“Registry keys for context menu entries written, but no context menu entries”中讨论了类似的问题,但建议的解决方案是查询 "ProgID"(即由 HKEY_CLASSES_ROOT\.extension
键指定的文件名类型) ,这对我不起作用。
是否有一些可靠的方法可以根据文件扩展名创建这些上下文菜单条目,而不依赖于 ProgID
集?
作为解决方法,在“Add a Windows Shell context menu entry for a specific extension (not file type)”中,建议将 \*\
键与 AppliesTo
过滤器一起使用。然而,它确实感觉像是一种变通方法而不是一个干净的解决方案,所以我正在寻找一种干净可靠地使用 HKEY_CLASSES_ROOT\.extension\shell
接口的可能性。
Windows XP 添加了一种方法,可以在不依赖 prog-id 的情况下向文件扩展名添加补充动词; the HKEY_CLASSES_ROOT\SystemFileAssociations
key。您可以注册特定的扩展名或感知的文件类型(文本、视频等)。
将您的注册直接放在 .extension
键中是不可靠的,当扩展程序正常工作时它无法正常工作 prog-id。
当您想更改默认操作时,将注册放在 prog-id 中是正确的方法,并且它至少从 Windows 95 开始就以这种方式工作。改变了什么然而,时间是 prog-id 的确定方式。在某个时候,一个未记录的 Explorer 相关密钥开始控制 .extension 到 prog-id 映射的内容,并防止应用程序更改用户默认值,此信息现在是 "encrypted".
当前的指南是,对于您想成为默认动词的扩展,您可以以正常方式注册 prog-id 并将扩展指向此 prog-id。如果此扩展已被另一个 prog-id 占用,则用户必须手动更改默认值,您不能以编程方式更改。您可能想在 Default Programs 上注册自己,这样您的应用程序就会出现在控制面板的默认程序 UI 中。