请考虑这样一个场景

一个文件夹里有五个文档,你选择它们,然后右键选择”打印”,系统会将它们打印出来,这毫无疑问。但是如果你细心观察一下,就会发现系统打印它们的顺序是随机的,这是为啥呢?

并没有什么魔幻的事情发生。外壳会一次在每个文档上执行”打印”这个动作,根据对应的打印程序事先注册好的打印流程,来执行下面几个动作中的一种:

> 大多数情况下,打印文档的程序会在shell\print\command注册表键值下注册一个简单的命令。在这种情况下,应用程序会打开5次,每次打开不同的文件。所有这些打印命令现在都在争用打印机,问题是程序的哪个实例首先提交其打印作业,这决定了它们从打印机出来的顺序(你可能会看到,最先打印出来的是一份最短和最简单的文档,因为它们需要更少的时间来渲染)。

> 偶尔情况下,打印文档的程序会在shell\print\ddeexec注册表键值下注册一个DDE动作谓词(verb)。在这种情况下,将启动这个应有程序的实例,并每次都指定一个待打印的文件的文件名。对于这些文件的处理,完全取决于应用程序。如果程序支持后台打印,它可能会将文档的打印分流到后台线程上,现在你的解决方案与之前的场景大致相同: 五个后台线程每个都争相查看谁能先提交它们的打印作业。

> 在极少的情况下,打印文档的程序在shell\print\DropTarget注册表键值下注册了一个拖放处理器处理程序(Drop Handler)。在这种情况下,拖放目标(Drop Target)被实例化并被赋予文件列表。然后由拖放目标决定如何处理这些文档。

总结

关于更多关于以上三种打印注册方式的细节信息,可以参考MSDN关于动作谓词(Verb)以及文件关联(File Associations)方面的内容。小弟就不细说了。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《Why are documents printed out of order when you multiselect and choose “Print”?》

为什么文件只打印一半(为什么多个文件打印时顺序是随机的)(1)

,