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

标签 windows visual-c++ printing

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

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

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

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

有人要吗?或者有没有人想分享任何陷阱?

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

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

最佳答案

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

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

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

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

关于windows - 如何在 Windows 中控制打印机的打印机托盘选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/165567/

相关文章:

c++ - 理解 C++ 中的抽象

android - 适用于 Android 的蓝牙打印机的步骤

c++ - 使用不同的 .dll 静态链接二进制文件(导出相同的符号)

c++ - Visual Studio 无法识别 __AVX2__ 或 __AVX__

c++ - 在 windows 下构建(和运行)RInside 示例

c++ - 从 this->class 构造函数调用类构造函数(不同的参数)?

python - 使用默认打印机打印文本文件

c# - 在 C# 中实现 MS Word 打印质量

.net - 如何完全卸载 Visual Studio 2010?

c# - FFmpeg 跳过渲染帧