如何在Windows中控制打印机的打印机托盘select

我们需要能够更改给定打印机的默认选定打印托盘。 有没有人有这样做的VC ++ / win32代码?

万一它很重要,我相信我们必须改变打印机的默认设置。 我们的打印作业是由我们以外的应用程序执行的,所以我们不能在来自应用程序内部的打印操作的上下文中进行这些更改。 除非有办法在不同的应用程序中修改默认的打印设置,否则我认为我们会改变用户打印机的默认设置,启动打印作业,然后将默认设置恢复为原始值。

我们真的希望只有当前用户的默认设置有变化,不需要任何特殊的UAC标高等。

我怀疑它将使用类似于此MSDN文章中显示的内容 ,并涉及在DEVMODE结构(dmDefaultSource或dmFormName或两者)中设置字段。

任何接受者? 还是有没有人有任何他们想分享的陷阱?

编辑:这是DEVMODE文档DEVMODE文档的链接

编辑:我也应该指出,我们正在寻找一个通用的解决scheme – 而不是特定的打印机(我们部署在许多很多的环境)

像这样设置功能可能会非常棘手,特别是如果驱动程序不遵循Microsoft的打印指南。 这就是说,我们已经与System.Drawing.Printing.PrinterSettings取得了一些成功。 您可以设置PaperSource,但我不确定您可以设置默认值。

如果你还没有看到这个例子,你可能需要进一步研究。 它描述了一种存储和重新加载打印机设置的方法。 我的一个人指出了我: PrinterSettings – 更改,存储和加载打印机设置

另一种方法,可以工作,但可能无法为你工作,是确定你需要的少数设置。 安装每台打印机(即:纸盒1,纸盒2)的设置。 然后简单地打印打印默认打印机。 不是你正在寻找,但它可能会有所帮助。

我们通常在这些情况下做的是第三方应用程序将数据写入到我们正在监视的文件夹中,然后我们拿起文件并自己解析Postscript或PCL,然后更改纸盒,然后发送到目标设备。 这听起来很简单。

dmDefaultSource控制托盘。 不幸的是,你要设置这个值取决于你的驱动程序,因为这是一个bin号码,并不一定是打印在打印机上的托盘#相同的数字。

以下链接提供了一些用于收集有关打印机托盘/纸盒分配信息的VB6代码。 您可以使用该信息以编程方式将dmDefaultSource分配给托盘的相应bin#。 您基本上需要使用DeviceCapabilities来返回有关您的打印机的信息,然后搜索一个字符串(如“纸盒1”)来获取关联的bin编号。

http://support.microsoft.com/kb/194789

仅供参考 – 我们使用的解决方案是捕获DEVMODE结构。 我们有一个小型的win32应用程序,它提供了打印机设置对话框(通过DocumentProperties ,fMode设置为DM_IN_PROMPT)。 然后将得到的DEVMODE保存到磁盘。 当我们打印时,我们捕获当前的DEVMODE,设置存储的DEVMODE,开始打印,然后恢复原始的DEVMODE。

这实际上工作得很好。 有时,打印驱动程序将更新并导致存储的DEVMODE中断,但这并不经常发生,用户可以很容易地修复。

作为额外的奖励,这种方法允许我们捕获所有的打印机设置(不只是输出托盘) – 所以我们能够支持像装订,整理等高级设置…

提示:如果您尝试此操作,请务必以二进制输出流的形式写入磁盘。 在我对这种方法的初步评估中,我意外地将输出流设置为文本输出流。 在很多情况下,事情会正常工作,然后突然中断一些打印机(在DEVMODE私有数据中使用高位字节)。 一个愚蠢的,但很容易,犯错误 – 一个从一个桌子上拿了一个很好的解决方案。

我最近必须在特定的打印机驱动程序上做类似的事情,它需要一个供应商特定的SDK。 该托盘似乎不会出现在DEVMODE或任何其他PRINTINFO_ *结构,所以我想我会把一封电子邮件给打印机供应商。

作为最后的手段,我可​​以想到两个可能的黑客行为。 一种是使用诸如AutoIT之类的脚本工具在GUI级别自动化驱动程序。 其次是将注册表转储到文件,更改驱动程序设置,再次转储注册表,并比较差异(可能或可能不起作用)。

据我所知,打印机驱动程序通过发送SNMP或PJL命令来控制打印机。 但并不是所有的打印机都能完全执行这些命令。

对于惠普打印机,我发现在http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&cc=us&objectID=bpl07282&jumpid=reg_R1002_USEN一些PJL命令(也有一些与托盘有关)。

我不确定这个帮助,但把它作为未来搜索的暗示…