我在Windows 8.1计算机上安装了八台不同的打印机。这些打印机是各种制造商和型号,有两台HP LaserJet打印机,一台Epson喷墨打印机,一台CutePDF打印机,一台Windows传真打印机等。
对于我的所有打印机,此DeviceCapabilities的调用返回-1,这意味着"要么不支持该功能,要么一般功能失败"。其他fwCapability
值(例如DC_DUPLEX
)会成功。
DeviceCapabilities(pDevice, pPort, DC_MANUFACTURER, NULL, &devMode);
我的猜测是DC_MANUFACTURER
和DC_MODEL
是"更新"因此没有实现。 CUPS具有printer-make-and-model
属性,必需的PPD选项Manufacturer
和Model
。
使用Win32查询打印机制造商和型号的正确方法是什么?
答案 0 :(得分:1)
DC_MANUFACTURER
和DC_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_6
和pszMfgName
但这可能不太有用。