Windows shell编程的基本思想是可以将给定的文件types(扩展名)与MS当前正在调用的progid(例如Company.Type.Ver)相关联:
HKCR \ .txt @ = Acme.Text.1
HKCR \ Acme.Text.1 @ =这是Acme的文本文件关联的progid
然后Acme Corp可以将HKCR \ Acme.Text.1 \ shell的子键(如HKCR \ Acme.Text.1 \ shell \ open)放入任意多个shell动词。
但是,如果我是XyzCorp,如何添加辅助动词到文本文件?
我不想篡夺主文件关联 – 我很高兴它与Acme.Text.1相关联,但我想添加“导入到Xyz编辑器”。
我可以:
1.给Acme的progid添加一个动词(如HKCR \ Acme.Text.1 \ shell \ my-verb)
2.为我们两个人创build一个新的progid,并将Acme的数据复制到该数据中,并将XyzCorp的动词合并到
3.直接向文件扩展名添加动词(至less可以这样做)
4.
有谁知道这个“正确”的答案?
编辑:我真的不高兴任何解决scheme,涉及不得不修改别人的PROGID。 我真的希望添加一些东西 – 一个IContextMenu或任何需要的,在关联的PROGID外添加额外的动词/选项给定的文件types。
这似乎是一个疯狂的系统,如果progid是个别开发公司拥有的,可以随意删除或更改。 这会使我感到脆弱(卸载某些东西和噗噗,文件扩展名停止工作,或者安装某些东西,同样的,你的第二动词也会消失,因为ext现在映射到一个不同的专有的PROGID,当我们安装(当时不知道这个其他的不存在progid)),只是愚蠢的。 毕竟,所有这些版本的Windows,微软都没有想出一种给定文件types的处理层的方法? 真?!?
我只是发现这个flabbergasting! less年编程101涉及学习命令模式或其他分层/级联系统。 Windows WinProcs本身被组织成一个命令模式模式 – 这样,从内部窗口上下文到外部,许多可能的处理程序在给定的MSG被给予一个裂缝。
当然,有一种方法可以添加适用于多个扩展的动词,而不会覆盖扩展的主要progid关联,而这个关联本身完全独立于主扩展 – > progid映射(这样用户可以随时间安装多个程序,而且仍然有权访问该文件types的辅助动词)。
我想我可以看看HKCR。* …我知道它可能会添加适用于所有文件types的动词。 但是,我需要find一些方法来过滤,以便我们的动词只存在于我们应该适用的实际文件types中。
这是可能的,这很容易做(一旦你知道在哪里看)。 魔术在于关键的HKEY_CLASSES_ROOT\SystemFileAssociations
。 在这里你会发现很多以文件扩展名命名的子项。 只需在这些下创建你想要的shell / open /命令键。
这是一个显示结构的示例注册表文件。 如果将其保存为.reg文件并将其导入,那么您将在所有.txt文件中添加“Import into Xyz Editor”命令,而不会影响主文件关联:
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\""
同样在HKCR\SystemFileAssociatons
有几个键不以扩展名命名:“text”,“image”,“video”等。这些对应于HKCR扩展名下的PerceivedType
条目。 例如, HKCR\.png\PerceivedType
设置为“image”, HKCR\.jpg\PerceivedType
也是如此,因此您可以在HKCR\SystemFileAssociations\image
下添加处理程序,该程序将显示所有“图像”类型。
文件扩展名下的无名值(又名默认值或标准值)可以是一个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上试过,不幸的是它没有工作。 动词必须在文件类型键下设置,而不是文件的extesion键。
4.
您可以创建一个ContextMenu处理程序 – 这是一个外壳扩展,需要实现COM接口。 壳上下文菜单中描述了与简单的注册表配置的动词相比,上下文菜单处理程序的区别和优点的概述。
总结为了简单,我会去#1。 XYZCorp的安装程序可以检查文件扩展名是否存在文件类型,如果是,则在现有类型下添加动词,或者创建一个新的文件类型(如果不存在)并在其下注册该动词。