如何控制Windows中打印机的打印机托盘选择

时间:2008-10-03 03:19:30

标签: windows visual-c++ printing

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

如果重要,我相信我们必须更改打印机的默认设置。我们的打印作业由我们以外的应用程序执行,因此我们无法在源自应用程序内部的打印操作的上下文中进行这些更改。除非有某种方法可以修改其他应用程序中的默认打印设置,否则我认为我们无法更改用户的打印机默认设置,启动打印作业,然后将默认设置恢复为原始值。

我们真的更喜欢只为当前用户更改默认值,而不需要任何特殊的UAC提升等等。

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

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

编辑:以下是DEVMODE文档DEVMODE documentation

的链接 编辑:我还应该指出,我们正在寻找一个通用的解决方案 - 不是特定于特定打印机的东西(我们在许多环境中部署)

5 个答案:

答案 0 :(得分:2)

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

这实际上效果很好。有时,打印驱动程序会更新并导致存储的DEVMODE中断,但这种情况不会经常发生,并且用户可以轻松修复。

作为额外的奖励,这种方法允许我们捕获所有打印机设置(而不仅仅是输出托盘) - 因此我们能够支持诸如装订,整理等高级设置......

提示:如果您尝试这样做,请务必将磁盘写入二进制输出流。在我对这种方法的初步评估中,我不小心将输出流设置为文本输出流。在许多情况下,情况会正常,然后突然中断一些打印机(在DEVMODE私有数据中使用高位字节)。这是一个愚蠢而又容易犯的错误 - 而且还有一段时间从桌面上拿出一个很好的解决方案。

答案 1 :(得分:1)

设置这样的功能可能很棘手,尤其是如果驱动程序不遵循Microsoft的打印指南。话虽这么说,我们在System.Drawing.Printing.PrinterSettings上取得了一些成功。您可以设置PaperSource,但我不确定您是否可以设置默认值。

如果您还没有看过这个例子,您可能需要进一步了解它。它描述了一种存储和重新加载打印机设置的方法。我的一个人向我指出: PrinterSettings - Changing, Storing and Loading Printer Settings

另一种可行但可能不适合您的方法是确定您需要的少量设置。安装具有以下各项(即:纸盘1,纸盘2)设置的打印机。然后只需在打印时切换默认打印机。不是你想要的,但它可能有所帮助。

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

答案 2 :(得分:1)

dmDefaultSource控制托盘。不幸的是,您希望将此值设置为不同,具体取决于您的驱动程序,因为这是一个bin编号,并且不一定与打印机上打印的#托盘编号相同。

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

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

答案 3 :(得分:0)

我最近必须在specific printer driver做一些非常类似的事情,它需要特定于供应商的SDK。托盘似乎没有出现在DEVMODE或任何其他PRINTINFO_ *结构中,所以我想我会向打印机供应商发送一封电子邮件。

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

答案 4 :(得分:0)

据我所知,打印机驱动程序通过发送SNMP或PJL命令来控制打印机。但并非所有打印机都完全实现这些命令集。

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

我不确定这个帮助,但请将其作为未来搜索的暗示......