如何用Win32检测彩色打印机?

Jac*_*ble 5 c printing winapi

我有两台黑白打印机、两台彩色打印机和一些虚拟打印机(传真、CutePDF Writer 等)。

根据DC_COLORDEVICE查询DeviceCapabilities,只有传真虚拟打印机是黑白的。

根据PLANES查询BITSPIXELGetDeviceCaps所有打印机都有一个平面,只有Fax和CutePDF有1位/像素(黑白)。

根据NUMCOLORS查询GetDeviceCaps,只有传真是黑白的。

我对直接查询驱动程序不感兴趣,所以我还没有尝试过。

如何使用 Win32 准确检测彩色打印机?

Adr*_*thy 3

DC_COLORDEVICE没给出正确答案真是太糟糕了。你的其余发现并不令我惊讶。

您可以尝试使用CreateIC为打印机创建信息上下文,然后使用GetDeviceCaps检查COLORRES属性。

(信息上下文就像一个设备上下文,您可以查询但不能实际绘制。当您想知道打印机驱动程序将要做什么而不实际创建真正的设备上下文时,它很有用,这可能需要打印机在线的。)

检查平面的数量是没有用的,因为所有东西(到一个很好的近似值)都使用一个平面。每个像素的位数实际上并不能告诉您这些像素是彩色的还是灰度的(或者只是调色板条目)。

另一个想法是查看设备dmColor默认DEVMODE中的字段。

很多很多年前(在 DeviceCapability 之前)我必须解决同样的问题,但我不记得我是如何做到的。

2022 年 12 月 27 日更新:我在尝试弄清楚如何处理传真虚拟打印机时刚刚遇到了自己的答案。使用 查询 DeviceCapabilityW 时DC_COLORDEVICE,传真驱动程序返回值 -1 并且 GetLastError 报告 122(ERROR_INSUFFICIENT_BUFFER“传递给系统调用的数据区域太小。”)这很奇怪,因为不需要为此查询传递缓冲区。

我目前的解决方案是检查一切。如果 DeviceCapabilityDC_COLORDEVICE没有明确表示颜色,或者如果 DEVMODE 的 dmFields 位掩码没有设置 DM_COLOR 位,或者如果 DEVMODE 的 dmColor 字段没有明确设置 DMCOLOR_COLOR,或者如果 GetDeviceCaps NUMCOLORS 不至少为 8,那么我认为它是单色打印机或用户为此打印作业选择单色。

  • 这取决于您如何阅读“DEVMODE.dmColor”,如果您通过“EnumPrinters”,它应该始终是彩色打印机的颜色。但是,如果打印机的默认设置是灰度,并且您通过“PRINTDLG”,那么它会读取黑白。如果是这种情况,您可以覆盖并将其设置回颜色模式。 (2认同)