可以通过创建注册表项(例如
)为Window的所有文件的File Explorer创建上下文菜单项。[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"
但这也不起作用。此外,由于强烈假定定义此类注册表项的每个人都使用相同的文件类型名称作为扩展名,因此它降低了兼容性(计算机示例:.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
界面的可能性。
答案 0 :(得分:1)
Windows XP添加了一种在不依赖于prog-id的情况下将补充动词添加到文件扩展名的方法。 the HKEY_CLASSES_ROOT\SystemFileAssociations
key。您可以注册特定的扩展名或可识别的文件类型(文本,视频等)。
直接在.extension
键中进行注册是不可靠的,当扩展名具有有效的prog-id时,该注册将无法正常工作。
当您想更改默认操作时,将注册放入prog-id是正确的方法,并且至少从Windows 95起这种方式就起作用了。但是,随着时间的推移,prog-id的方式有所变化决心,决意,决定。在某个时候,一个未记录的与Explorer相关的密钥开始控制.protension-prog-id映射的扩展名,并且为了防止应用程序更改用户默认值,该信息现在被“加密”了。
当前的指导原则是,对于要用作默认动词的扩展名,请以常规方式注册prog-id,并将扩展名指向该prog-id。如果此扩展名已被另一个prog-id声明,则用户必须手动更改默认值,因此无法以编程方式对其进行更改。您可能想向Default Programs注册自己,以便您的应用程序出现在控制面板的“默认程序” UI中。