如何在Windows shell中为文件类型添加辅助动词?

Mor*_*hai 9 windows registry windows-shell

Windows shell编程的基本思想是,您可以将给定的文件类型(扩展名)与MS当前调用的编译器(例如,Company.Type.Ver)相关联:

HKCR\.txt @ = Acme.Text.1

HKCR\Acme.Text.1 @ =这是Acme文本文件关联的progid

然后Acme Corp可以将尽可能多的shell动词作为HKCR\Acme.Text.1\shell的子键,例如HKCR\Acme.Text.1\shell\open.

但如果我是XyzCorp,如何在文本文件中添加辅助动词?

我不想篡夺主文件关联 - 我很高兴它与Acme.Text.1相关联,但我想添加"导入到Xyz编辑器".

我可以:
1.向Acme的progid添加一个动词(例如HKCR\Acme.Text.1\shell\my-verb)
2.代表我们创建一个新的progid并将Acme的数据复制到那个,并将XyzCorp的动词合并到
3.将动词直接添加到文件扩展名(至少有一个曾经能够这样做)
4.???

有谁知道这个"正确"的答案?

编辑:我真的不喜欢任何涉及修改别人的PROGID的解决方案.我真的更愿意在相关的PROGID之外添加一些东西 - 一个IContextMenu或其他任何东西,以便为给定的文件类型添加额外的动词/选项.

似乎这样一个疯狂的系统有ext-> progid,其中progid由个别开发公司拥有,并且可以随意删除或更改.这让我觉得很脆弱(卸载东西和poof,你的文件扩展名停止正常工作,或安装一些东西,同样你的辅助动词消失,因为ext现在映射到一个不同的专有PROGID,我没有添加我们的动词安装(当时,不知道任何关于这个其他尚未存在的程序)),而且只是愚蠢.在所有这些时间之后,所有这些版本的Windows和Microsoft从未找到过为给定文件类型提供多层处理程序的方法?真?!?

我发现那令人惊叹!初级编程101涉及学习命令模式或其他分层/级联系统.Windows WinProcs本身是以命令模式模式组织的 - 因此从内部窗口上下文到外部,许多可能的处理程序在给定的MSG中被给予破解.

当然有一种方法可以添加一个适用于多个扩展的动词,而不会覆盖扩展的主要progid关联,它本身完全独立于主扩展 - > progid映射(这样用户可以随着时间的推移安装多个程序,并且仍然有权访问该文件类型的辅助动词).

我想我可以看看HKCR.*...我理解可以在那里添加适用于所有文件类型的动词.但是,我需要找到一些方法来过滤,这样我们的动词才真正存在于我们应该应用的实际文件类型中......

Boa*_*ann 13

这是可能的,而且很容易做到(一旦你知道在哪里看).关键在于魔力HKEY_CLASSES_ROOT\SystemFileAssociations.在这里,您将找到以文件扩展名命名的许多子项.只需在这些下创建所需的shell/open/command键即可.

这是一个显示结构的示例注册表文件.如果将其保存为.reg文件并导入它,那么您将在所有.txt文件中添加"导入Xyz编辑器"命令,并且不会影响主文件关联:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import]
@="Import into Xyz Editor"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\shell\xyz-import\command]
@="notepad.exe \"%1\""
Run Code Online (Sandbox Code Playgroud)

另外还有HKCR\SystemFileAssociatons几个没有以扩展名命名的键:"text","image","video"等.这些对应PerceivedType于HKCR扩展名下的条目.例如,HKCR\.png\PerceivedType设置为"image",HKCR\.jpg\PerceivedType因此您可以添加将在HKCR\SystemFileAssociations\image其下显示所有"图像"类型的处理程序.


mdm*_*dma 5

文件扩展名下的未命名值(也称为默认值或标准值)可以是progID,但不一定是.它只是一个标识符.您可以在文件类型标识符下添加动词,即使它看起来像是其他人的名字.接下来的段落将考虑每个选项.

1.给Acme的progid添加一个动词(例如HKCR\Acme.Text.1\shell\my-verb)

这个得到我的投票.它简单而有效.升级/重新安装ACME软件不会影响您添加到ACME文件类型/ progid的动词.卸载Acme的软件通常不会删除您的动词,因为卸载程序通常不会删除包含他们未创建的子项的注册表项.

2.代表我们创建一个新的progid并将Acme的数据复制到那个,并将XyzCorp的动词合并到

这将在更改时起作用,但在Acme的程序升级/重新安装时将停止工作 - 安装程序将不知道更新共享文件类型.类似地,当Acme的卸载程序运行时,它不会删除动词,因此它们将悬挂命令到不存在的路径.

3.将动词直接添加到文件扩展名(至少一个曾经能够这样做)

我刚刚在Win XP SP3上试过这个,不幸的是它没有用.动词必须在文件类型键下设置,而不是文件扩展键.

4. ???

您可以创建ContextMenu处理程序 - 这是一个shell扩展,需要实现COM接口.Shell上下文菜单中描述了与简单注册表配置的谓词相比较的上下文菜单处理程序的差异和优点的概述.

总结 为简单起见,我选择#1.XYZCorp的安装程序可以检查文件扩展名是否存在文件类型,如果是,则在现有类型下添加谓词,或者如果不存在则创建新文件类型并在其下注册动词.