You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从打印机设备上下文判断打印作业的彩色/黑白设置?

如何通过打印机设备上下文判断打印模式(彩色/黑白)

核心问题

给定打印机的设备上下文(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>(&currentDm), 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:55:21