代码之家  ›  专栏  ›  技术社区  ›  Kevin Day

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

  •  5
  • Kevin Day  · 技术社区  · 17 年前

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

    如果有关系,我相信我们必须更改打印机的默认设置。我们的打印作业是由应用程序以外的应用程序执行的,因此我们不能在源自应用程序内部的打印操作的上下文中进行此类更改。除非有办法在不同的应用程序中修改默认的打印设置,否则我认为我们无法更改用户对打印机的默认值,启动打印作业,然后将默认值设置回原始值。

    我们真的希望只为当前用户更改默认值,而不需要任何特殊的UAC高程等。。。

    this MSDN article ,并涉及在DEVMODE结构中设置字段(dmDefaultSource或dmFormName或两者)。

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

    5 回复  |  直到 17 年前
        1
  •  2
  •   Kevin Day    14 年前

    DocumentProperties 将fMode设置为DM_(在_提示符中)。然后将生成的DEVMODE保存到磁盘。当我们进行打印时,我们捕获当前DEVMODE,设置存储的DEVMODE,启动打印,然后恢复原始DEVMODE。

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

    提示:如果您尝试此操作,请确保以二进制输出流的形式写入磁盘。在我对这种方法的初始评估中,我意外地将输出流设置为文本输出流。在许多情况下,情况都会很好,但对于某些打印机(在DEVMODE私有数据中使用了高阶字节)来说,情况会突然发生变化。这是一个愚蠢但容易犯的错误,而且一个很好的解决方案被搁置了一段时间。

        2
  •  1
  •   Douglas Anderson    17 年前

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

    PrinterSettings - Changing, Storing and Loading Printer Settings

    另一种可能有效但可能不适用于您的方法是确定您需要的少量设置。安装带有这些(即:纸盘1、纸盘2)设置的打印机。然后只需将默认打印机切换为“打印”。这不是你想要的,但可能会有帮助。

    在这些情况下,我们通常会让第三方应用程序将数据写入我们监控的文件夹,然后我们自己提取文件并解析Postscript或PCL,然后更改纸盘,然后发送到目标设备。听起来简单多了。

        3
  •  1
  •   Stimy    17 年前

    dmDefaultSource控制托盘。不幸的是,您希望将其设置为不同的值取决于您的驱动程序,因为这是一个箱子号,不一定与打印机上打印的纸盘号相同。

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

        4
  •  0
  •   SmacL    17 年前

    最近,我不得不在一次旅行中做一些非常类似的事情 specific printer driver 它需要一个特定于供应商的SDK。托盘似乎没有出现在DEVMODE或任何其他PRINTINFO_*结构中,因此我想我应该向打印机供应商发送电子邮件。

    AutoIT . 其次是将注册表转储到文件,更改驱动程序设置,再次转储注册表,并比较差异(可能有效,也可能无效)。

        5
  •  0
  •   Citrone    17 年前

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

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

    我不确定这是否有帮助,但将其作为未来搜索的提示。。。