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

How to detect color printer with Win32?

提问人:Jacob Marble 提问时间:12/17/2015 更新时间:12/28/2022 访问量:389

问:

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

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

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

根据查询到,只有传真是黑白的。NUMCOLORSGetDeviceCaps

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

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

C WinAPI 打印

评论

0赞 Jonathan Potter 12/17/2015
Chrome必须这样做,因为它提供了自己的打印对话框,其中包括颜色和黑白选项,因此您可以获取其来源并查看。
0赞 Jacob Marble 12/19/2015
code.google.com/p/chromium/codesearch#chromium/src/printing/......看起来他们使用DC_COLORDEVICE

答:

3赞 Adrian McCarthy 12/17/2015 #1

很遗憾,没有给出正确的答案。你的其他发现并不让我感到惊讶。DC_COLORDEVICE

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

(信息上下文类似于可以查询但实际上无法绘制到的设备上下文。当您想知道打印机驱动程序将要执行的操作而不实际创建实际设备上下文时,这很有用,这可能需要打印机处于联机状态。

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

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

很多很多年前(在 DeviceCapabilities 之前),我不得不解决同样的问题,但我不记得我是怎么做到的。

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

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

评论

0赞 Barmak Shemirani 12/17/2015
DEVMODE/dmColor可能更容易,也可以通过 OR / ---- 是 2 用于彩色打印机。PRINTDLGEnumPrintersPRINTER_INFO_2pDevMode->dmColor
0赞 Jacob Marble 12/17/2015
好吧,我以为我已经检查过了,但显然我没有。对于我的所有打印机,结果都是 100% 准确的。谢谢阿德里安。DEVMODE.dmColor
0赞 Jacob Marble 12/17/2015
嗯,不返回默认颜色模式?因此,如果打印机能够着色,但默认为黑白,那么我会认为它是黑白,是吗?DEVMODE.dmColor
2赞 Barmak Shemirani 12/17/2015
这取决于你如何阅读,如果你通过它,它应该始终是彩色打印机的颜色。但是,如果打印机的默认设置是灰度,并且您通过,则它读取黑白。如果是这种情况,您可以覆盖并将其设置回颜色模式。DEVMODE.dmColorEnumPrintersPRINTDLG