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

Kev*_*Day 5 windows printing visual-c++

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

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

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

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

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

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

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

Kev*_*Day 2

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

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

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

提示:如果您尝试此操作,请确保将其作为二进制输出流写入磁盘。在我对此方法的初步评估中,我不小心将输出流设置为文本输出流。在许多情况下一切都可以正常工作,但对于某些打印机(在其 DEVMODE 私有数据中使用高位字节)突然中断。这是一个愚蠢但很容易犯的错误,并且导致一个非常好的解决方案暂时搁置。