5

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

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

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

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

有接盘侠吗?或者有没有人有任何他们想分享的问题?

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

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

4

5 回答 5

2

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

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

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

提示:如果您尝试这样做,请确保将其作为二进制输出流写入磁盘。在我对这种方法的初步评估中,我不小心将输出流设置为文本输出流。在许多情况下事情会正常工作,然后突然中断某些打印机(在其 DEVMODE 私有数据中使用高位字节)。一个愚蠢但容易犯的错误 - 并且在一段时间内放弃了一个非常好的解决方案。

于 2012-05-29T03:25:02.830 回答
1

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

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

另一种可能有效但可能不适合您的方法是确定您需要的少数设置。安装具有这些(即:纸盘 1、纸盘 2)设置的打印机。然后只需在打印时切换默认打印机。不是您要找的东西,但它可能会有所帮助。

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

于 2008-10-07T13:58:13.047 回答
1

dmDefaultSource 控制托盘。不幸的是,您要设置的值因驱动程序而异,因为这是一个 bin 编号,不一定与打印机上打印的托盘编号相同。

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

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

于 2009-01-26T19:20:36.503 回答
0

我最近不得不在特定的打印机驱动程序上做一些非常相似的事情,它需要一个供应商特定的 SDK。托盘似乎没有出现在 DEVMODE 或任何其他 PRINTINFO_* 结构中,所以我想我会向打印机供应商发送一封电子邮件。

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

于 2008-10-03T06:49:40.950 回答
0

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

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

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

于 2008-10-03T11:05:02.660 回答