我正在尝试使用 win32 (winspool) API 确定打印机支持的实际介质尺寸(Letter、A4 等)。根据文档,EnumForms
枚举打印机支持的格式(介质尺寸),但对于所有打印机,它返回计算机上注册的所有格式。
DeviceCapabilities
可以返回与媒体尺寸相关的三条不同信息:
DC_PAPERNAMES
返回打印机支持的所有介质尺寸的名称,但这些名称与 返回的表单名称不匹配。此外,表单名称始终为英文,因此与其他语言返回的表单EnumForms
名称完全不匹配。DC_PAPERNAMES
DC_PAPERSIZE
返回打印机支持的所有介质的尺寸,但这些尺寸与 返回的表单中的尺寸并不完全匹配EnumForms
。此外,没有边距信息。
DC_PAPERS
返回每个受支持的介质尺寸的 Windows dmPaperSize 值。但是,似乎没有任何方法可以确定相应的格式。
我如何获得实际支持的媒体尺寸(如 form_info_X)值?
要获取每种介质尺寸的信息,首先需要获取打印机支持的所有尺寸。这可以通过调用 DeviceCapabilities 请求 DC_PAPERS 功能来获取。返回的值与 DEVMODE 结构体的 dmPaperSize 字段中使用的值相同。稍后会详细介绍。虽然设备功能可用于检索纸张名称 (DC_PAPERNAMES) 和纸张尺寸 (DC_PAPERSIZE),但我们不需要这些,因为纸张名称与特定语言环境相关,并且我们无法确定自定义纸张尺寸的返回值。同样,多种介质尺寸可能具有相同的物理纸张尺寸,而 DC_PAPERSIZE 仅返回这些尺寸。DC_PAPERS 返回一个数字列表,我们将使用这些数字来检索每台打印机的纸张尺寸信息。
GetDeviceCaps 函数可用于获取介质的物理尺寸(宽度和高度)、可成像区域(同样是宽度和高度)以及当前设置的介质尺寸的可打印区域左上角的偏移量(x 和 y)。根据这些值,可以计算出纸张尺寸的边距。
因此,要获取某种纸张尺寸的所有介质尺寸信息,需要将打印机的介质设置为我们想要获取尺寸信息的介质尺寸(纸张尺寸),然后调用 GetDeviceCaps 来检索该纸张尺寸的尺寸信息。
设置打印机的当前纸张尺寸分为两步。这些步骤假设我们已经获取了打印机的 PRINTER_INFO_8 信息。其他 PRINTER_INFO 结构体也可以使用,只要它们包含 DEVMODE 结构体即可。
完成后,多次调用 GetDeviceCaps 来检索以下每条信息:PHYSICALWIDTH、PHYSICALHEIGHT、OFFSETX、OFFSETY、HORZRES 和 VERTRES。
要检索每种介质尺寸的尺寸信息,只需对每个 DC_PAPERS 值重复此过程。