如何从Win32 API获得打印机制造商和型号?

时间:2015-12-15 01:11:42

标签: c winapi printing

我在Windows 8.1计算机上安装了八台不同的打印机。这些打印机是各种制造商和型号,有两台HP LaserJet打印机,一台Epson喷墨打印机,一台CutePDF打印机,一台Windows传真打印机等。

对于我的所有打印机,此DeviceCapabilities的调用返回-1,这意味着"要么不支持该功能,要么一般功能失败"。其他fwCapability值(例如DC_DUPLEX)会成功。

DeviceCapabilities(pDevice, pPort, DC_MANUFACTURER, NULL, &devMode);

我的猜测是DC_MANUFACTURERDC_MODEL是"更新"因此没有实现。 CUPS具有printer-make-and-model属性,必需的PPD选项ManufacturerModel

使用Win32查询打印机制造商和型号的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

DC_MANUFACTURERDC_MODEL未在MSDN文档中列出,不值得研究。

pDevice中的

DeviceCapabilities参数通常是打印机名称和型号。例如“HP LaserJet 123”控制面板中的内容相同。这应该就是你所需要的。

有时打印机名称会发生​​变化,在这种情况下,您可以使用驱动程序名称来识别打印机。

int wmain()
{
    DWORD flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;
    int level = 2;
    PRINTER_INFO_2* printerInfo;
    DWORD memsize, printer_count;

    EnumPrinters(flags, NULL, level, NULL, 0, &memsize, &printer_count);
    if (memsize < 1) return 0;

    BYTE* bytes = new BYTE[memsize];
    if (EnumPrinters(flags, NULL, level, bytes, memsize, &memsize, &printer_count))
    {
        printerInfo = (PRINTER_INFO_2*)bytes;
        for (UINT i = 0; i < printer_count; i++)
        {
            std::wcout << "printer: " << printerInfo->pPrinterName << "\n";
            std::wcout << "printerInfo->pDriverName: " << printerInfo->pDriverName << "\n\n";
            printerInfo++;
        }
    }
    delete[] bytes;

    return 0;
}

在上面的代码中,printerInfo->pPrinterName应匹配打印机名称,如控制面板(或pDevice)所示。 printerInfo->pDriverName应始终为打印机名称和型号。

要获取制造商名称,您可以浏览DRIVER_INFO_6pszMfgName但这可能不太有用。