提问人:Jacob Marble 提问时间:12/17/2015 更新时间:12/28/2022 访问量:389
如何使用Win32检测彩色打印机?
How to detect color printer with Win32?
问:
我有两台黑白打印机、两台彩色打印机和一些虚拟打印机(传真、CutePDF Writer 等)。
根据对 DeviceCapabilities
的查询,只有传真虚拟打印机是黑白的。DC_COLORDEVICE
根据 GetDeviceCaps
的查询,所有打印机都有一个平面,只有 Fax 和 CutePDF 有 1 位/像素(黑白)。PLANES
BITSPIXEL
根据查询到,只有传真是黑白的。NUMCOLORS
GetDeviceCaps
我对直接查询驱动程序并不感到兴奋,所以我还没有尝试过。
如何使用 Win32 准确检测彩色打印机?
答:
很遗憾,没有给出正确的答案。你的其他发现并不让我感到惊讶。DC_COLORDEVICE
可以尝试使用 CreateIC 为打印机创建信息上下文,然后使用 GetDeviceCaps 检查该属性。COLORRES
(信息上下文类似于可以查询但实际上无法绘制到的设备上下文。当您想知道打印机驱动程序将要执行的操作而不实际创建实际设备上下文时,这很有用,这可能需要打印机处于联机状态。
检查飞机的数量是没有用的,因为所有东西(近似)都使用一个平面。每个像素的位数实际上并不能告诉您这些像素是彩色的还是灰度的(或只是调色板条目)。
另一个想法是查看设备默认 DEVMODE 中的字段。dmColor
很多很多年前(在 DeviceCapabilities 之前),我不得不解决同样的问题,但我不记得我是怎么做到的。
2022-12-27 更新:我只是在试图弄清楚如何处理传真虚拟打印机时遇到了自己的答案。使用 查询 DeviceCapabilitiesW 时,传真驱动程序返回值 -1,GetLastError 报告 122 (“传递给系统调用的数据区域太小。这很奇怪,因为不需要为此查询传递缓冲区。DC_COLORDEVICE
ERROR_INSUFFICIENT_BUFFER
我目前的解决方案是检查一切。如果 DeviceCapabilities with 没有显式显示颜色,或者如果 DEVMODE 的 dmFields 位掩码没有设置DM_COLOR位,或者如果 DEVMODE 的 dmColor 字段未显式DMCOLOR_COLOR,或者如果 GetDeviceCaps NUMCOLORS 不至少为 8,那么我假设它是单色打印机或用户为此打印作业选择了单色。DC_COLORDEVICE
评论
DEVMODE/dmColor
可能更容易,也可以通过 OR / ---- 是 2 用于彩色打印机。PRINTDLG
EnumPrinters
PRINTER_INFO_2
pDevMode->dmColor
DEVMODE.dmColor
DEVMODE.dmColor
DEVMODE.dmColor
EnumPrinters
PRINTDLG
评论