我遇到了一些奇怪的行为 - 似乎不可能在Windows中枚举爱普生墨水打印机的分辨率。特别是此代码始终报告错误:
int r, err;
char szBuffer[0x4000];
String prnName = "EPSON P50 Series";
String portName = "USB002";
r = DeviceCapabilities(prnName.c_str(), portName.c_str(), DC_ENUMRESOLUTIONS, NULL, NULL);
err = GetLastError();
printf("n 1.DevCap.result = %d, err = %d", r, err);
r = DeviceCapabilities(prnName.c_str(), portName.c_str(), DC_ENUMRESOLUTIONS, szBuffer, NULL);
err = GetLastError();
printf("n 2.DevCap.result = %d, err = %d", r, err);
在输出中,我看到以下内容:
1.DevCap.result = -1, err = 0
2.DevCap.result = -1, err = 13
注意:Windows 错误 13 是 ERROR_INVALID_DATA
.
你能帮我理解 - 如何正确解释吗?这是否意味着 Epson 墨水打印机的驱动程序不提供有关支持的打印分辨率的任何信息?还是真的传递了一些无效的参数?如果是,可能是哪一个?
提前谢谢你。
附言。请注意以下事项:
1) 打印机和端口名称正确。它们是通过EnumPrinters()
WinAPI 调用获得的。在此代码示例中,我切断了所有不相关的代码,因此仅保留失败的函数。
2)打印机本身工作正常,我可以打印文档和照片。
3)我还添加了一个"爱普生手写笔300"打印机,该打印机配置为使用"FILE:"端口进行打印。有趣的是 - 对此类打印机的DeviceCapabilities(DC_ENUMRESOLUTIONS)
调用也会报告错误#13。这就是为什么我倾向于认为所有爱普生墨水打印机都没有提供有关打印分辨率的任何信息......
4)所有其他对DeviceCapabilities()
函数的调用(用于DC_PAPERS, DC_PAPERSIZE
,DC_PAPERNAMES
等)适用于这些打印机(爱普生P50和爱普生手写笔300)。因此,打印机名称和端口名称是正确的,仅DeviceCapabilities(DC_ENUMRESOLUTIONS)
调用存在问题。
这似乎是那些爱普生打印机的错误。但是,分辨率值取决于设备,无论如何都不需要它。
您可能希望通过DEVMODE
获取打印机分辨率,只需将其报告给用户:
PRINTDLG pdlg = { sizeof PRINTDLG };
pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
PrintDlg(&pdlg);
DEVMODE* dm = (DEVMODE*)::GlobalLock(pdlg.hDevMode);
cout << "dm->dmDeviceName: " << dm->dmDeviceName << endl;
if (dm->dmFields & DM_PRINTQUALITY)
{
cout << "dm->dmPrintQuality: " << dm->dmPrintQuality << endl;
}
::GlobalUnlock(pdlg.hDevMode);
dmPrintQuality
是打印机分辨率或以下与设备无关的值之一:
#define DMRES_DRAFT (-1)
#define DMRES_LOW (-2)
#define DMRES_MEDIUM (-3)
#define DMRES_HIGH (-4)
如果用户想要更改此值,最好授予对打印机自己的设置对话框的访问权限。
我确认了EPSON手写笔照片RX595系列的问题。
Barmak Shenmirani 是正确的,DEVMODE
的dmPrintQuality
场将指示负常数之一,以粗略地了解分辨率或水平分辨率的正值(以每英寸像素为单位)。 在后一种情况下,您可以从DEVMODE
的dmYResolution
场获得垂直分辨率。
如果您使用级别 2 ( PRINTER_INFO_2
) 的 EnumPrinters
来获取名称和端口,那么您已经拥有默认 DEVMODE
的副本。
假设任何出现故障DC_ENUMRESOLUTIONS
只有一种分辨率的打印机似乎是一种合理的启发式方法,它是该默认DEVMODE
中的分辨率。 您可以尝试调出打印对话框并调整它提供的各种质量旋钮,以查看生成的DEVMODE
中的分辨率是否不同,但我怀疑它会改变。
就我的打印机而言,DEVMODE
中报告的每英寸 360×360 像素分辨率似乎是一个抽象值,因为打印机的规格声称"5760×1440 优化的 dpi"。 据推测,驱动程序会抖动所有这些点以实现 360×360 像素的有效密度。
为了确保这不仅仅是我的编码错误,我还为我的激光打印机(兄弟)运行了它,它报告了两种分辨率:600×600 和 300×300。