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

C 如何使用Win32检测彩色打印机?,c,winapi,printing,C,Winapi,Printing,我有两台黑白打印机、两台彩色打印机和一些虚拟打印机(传真机、CutePDF Writer等) 根据对的DC\u COLORDEVICE查询,只有传真虚拟打印机是黑白的 根据对的平面和位像素查询,所有打印机都有一个平面,只有Fax和CutePDF有1位/像素(黑白) 根据NUMCOLORS对GetDeviceCaps的查询,只有传真是黑白的 我对它不感兴趣,所以我还没有试过 如何使用Win32准确检测彩色打印机?令人遗憾的是,DC\u COLORDEVICE没有给出正确答案。你其余的发现我并不感到

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

根据对的
DC\u COLORDEVICE
查询,只有传真虚拟打印机是黑白的

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

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

我对它不感兴趣,所以我还没有试过


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

令人遗憾的是,
DC\u COLORDEVICE
没有给出正确答案。你其余的发现我并不感到惊讶

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

(信息上下文类似于设备上下文,您可以查询,但实际上无法绘制到该上下文。当您想知道打印机驱动程序在不实际创建真正的设备上下文的情况下将要做什么时,它非常有用,这可能需要打印机联机。)

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

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


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

Chrome必须解决这个问题,因为它提供了自己的打印对话框,其中包括颜色和黑白选项,所以你可以找到它的来源并看一看。看起来他们使用DC_COLORDEVICE
DEVMODE/dmColor
可能更容易,也可以通过
PRINTDLG
EnumPrinters
/
PRINTER\u INFO\u 2
----
pDevMode->dmColor
进行访问。我想我已经选中了
DEVMODE.dmColor
,但显然没有。对于我所有的打印机,结果都是100%准确的。谢谢Adrian.Hmm,
DEVMODE.dmColor
是否返回默认的颜色模式?因此,如果打印机能够使用颜色,但默认为黑白,那么我认为它是黑白的,是吗?这取决于您如何读取
DEVMODE.dmColor
如果您通过
EnumPrinters
进行操作,则彩色打印机应始终使用颜色。但是,如果打印机的默认设置为灰度,并且您通过
PRINTDLG
查看,则它将显示为黑白。如果是这种情况,您可以覆盖并将其设置回颜色模式。