如何从打印机设备上下文判断打印作业的彩色/黑白设置?
如何通过打印机设备上下文判断打印模式(彩色/黑白)
核心问题
给定打印机的设备上下文(DC)或信息上下文句柄,如何确定当前打印将使用彩色还是黑白模式?尝试通过DeviceCapabilitiesW、DEVMODEW等API检测后,发现无法直接从DC本身判断当前是否为黑白模式,是否必须跟踪DEVMODE中的dmColor字段?
测试代码示例
以下是简化的复现代码,展示获取默认打印机、修改DEVMODE为黑白模式后调用相关API的测试过程:
#include <windows.h> #include <iostream> int main() { // 获取默认打印机名称 wchar_t printerName[256]; DWORD size = sizeof(printerName) / sizeof(wchar_t); if (!GetDefaultPrinterW(printerName, &size)) { std::cerr << "获取默认打印机失败,错误码:" << GetLastError() << std::endl; return 1; } // 获取打印机DC HDC hdcPrinter = CreateDCW(L"WINSPOOL", printerName, nullptr, nullptr); if (!hdcPrinter) { std::cerr << "创建打印机DC失败,错误码:" << GetLastError() << std::endl; return 1; } // 获取DEVMODE DEVMODEW dm{}; dm.dmSize = sizeof(DEVMODEW); if (!GetPrinterDriverW(hdcPrinter, nullptr, 2, reinterpret_cast<LPBYTE>(&dm), sizeof(dm), &size)) { std::cerr << "获取打印机驱动信息失败,错误码:" << GetLastError() << std::endl; DeleteDC(hdcPrinter); return 1; } // 修改为黑白模式 dm.dmColor = DMCOLOR_MONOCHROME; // 更新DC的DEVMODE if (!ResetDC(hdcPrinter, &dm)) { std::cerr << "重置DC失败,错误码:" << GetLastError() << std::endl; DeleteDC(hdcPrinter); return 1; } // 尝试通过DeviceCapabilitiesW检测 DWORD caps = DeviceCapabilitiesW(printerName, nullptr, DC_COLORDEVICE, nullptr, nullptr); std::cout << "DC_COLORDEVICE返回值:" << caps << std::endl; // 仍返回支持彩色,无法反映当前模式 // 尝试从DC获取当前DEVMODE DEVMODEW currentDm{}; currentDm.dmSize = sizeof(DEVMODEW); if (!GetPrinterDriverW(hdcPrinter, nullptr, 2, reinterpret_cast<LPBYTE>(¤tDm), sizeof(currentDm), &size)) { std::cerr << "获取当前DEVMODE失败,错误码:" << GetLastError() << std::endl; } else { std::cout << "当前dmColor值:" << currentDm.dmColor << std::endl; // 能正确获取修改后的黑白模式 } DeleteDC(hdcPrinter); return 0; }
结论
无法直接通过DC句柄本身判断当前的打印颜色模式,必须通过跟踪DEVMODE结构体中的dmColor字段来确认:
dmColor = DMCOLOR_COLOR:彩色模式dmColor = DMCOLOR_MONOCHROME:黑白模式
原因在于DeviceCapabilitiesW这类API仅返回打印机的硬件支持能力,而非当前设置的工作模式;而DC本身不会主动暴露当前的颜色配置,必须通过关联的DEVMODE来获取。
内容的提问来源于stack exchange,提问作者Adrian McCarthy
相关产品推荐
相关产品推荐

