其实以前就研究过这个问题,只是当时粗心,漏看了 MSDN 中参数,以至当时没有找到计算的方法。 #define HORZRES 8 #define VERTRES 10 #define LOGPIXELSX 88 #define LOGPIXELSY 90 #define PHYSICALWIDTH 110 #define PHYSICALHEIGHT 111 #define PHYSICALOFFSETX 112 #define PHYSICALOFFSETY 113 #define DC_PAPERS 2 #define DC_PAPERSIZE 3 #define DC_PAPERNAMES 16 declare long CreateIC in win32api ; string lpszDriver, ; && driver name string lpszDevice, ; && device name string lpszOutput, ; && port or file name long lpdvmInit && optional initialization data declare long GetDeviceCaps in win32api ; long hdc, long nIndex declare long DeleteDC in win32api ; long hdc declare long DeviceCapabilities in winspool.drv ; string pDevice, ; && printer name string pPort, ; && port name long fwCapability, ; && device capability string @ pOutput, ; && output buffer string pDevMode && device data buffer m.lhPrintDc = CreateIC('winspool', set('printer', 2), null, 0) if 0 == m.lhPrintDc return endif m.lnPrintableX = GetDeviceCaps(m.lhPrintDc, HORZRES) m.lnPrintableY = GetDeviceCaps(m.lhPrintDc, VERTRES) m.lnDpiX = GetDeviceCaps(m.lhPrintDc, LOGPIXELSX) m.lnDpiY = GetDeviceCaps(m.lhPrintDc, LOGPIXELSY) m.lnActualX = GetDeviceCaps(m.lhPrintDc, PHYSICALWIDTH) m.lnActualY = GetDeviceCaps(m.lhPrintDc, PHYSICALHEIGHT) m.lnOffsetX = GetDeviceCaps(m.lhPrintDc, PHYSICALOFFSETX) m.lnOffsetY = GetDeviceCaps(m.lhPrintDc, PHYSICALOFFSETY) DeleteDC(m.lhPrintDc) m.lnFactorX = 2.54 * 100 / m.lnDpiX m.lnFactorY = 2.54 * 100 / m.lnDpiY ? replicate('-', 50) ? '打印机: ' + set('printer', 2) ? '纸张名: ' + transform(prtinfo(2, set('printer', 2))) ; + ' - ' + GetDefaultPaperName() ? replicate('-', 50) ? '最大区域: ', ; transform(m.lnActualX * m.lnFactorX) + ' x ' ; + transform(m.lnActualY * m.lnFactorY) ? '可用区域: ', ; transform(m.lnPrintableX * m.lnFactorX) + ' x ' ; + transform(m.lnPrintableY * m.lnFactorY) ? '上下边距: ', ; transform(m.lnOffsetY * m.lnFactorY) + ', ' ; + transform((m.lnActualY - m.lnPrintableY - m.lnOffsetY) * m.lnFactorY) ? '左右边距: ', ; transform(m.lnOffsetX * m.lnFactorX) + ', ' ; + transform((m.lnActualX - m.lnPrintableX - m.lnOffsetX) * m.lnFactorX) function GetDefaultPaperName local ii, lnPapers, lcBuffer, lnPaperId local array laPapers[1], laPaperName[1], laPaperSize[1] m.lnPapers = DeviceCapabilities(set('printer', 2), null, DC_PAPERS, null, null) if m.lnPapers < 1 return '' endif dimension laPapers[m.lnPapers], ; laPaperName[m.lnPapers], ; laPaperSize[m.lnPapers] m.lcBuffer = replicate(chr(0), 2 * m.lnPapers) DeviceCapabilities(set('printer', 2), null, DC_PAPERS, @ m.lcBuffer, null) for m.ii = 1 to m.lnPapers laPapers[m.ii] = ; ctobin(substr(m.lcBuffer, (m.ii - 1) * 2 + 1, 2), '2rs') endfor m.lnPaperId = ; ascan(laPapers, prtinfo(2, set('printer', 2)), -1, -1, 1, 1+4) if m.lnPaperId < 1 return '' endif m.lcBuffer = replicate(chr(0), 64 * m.lnPapers) DeviceCapabilities(set('printer', 2), ; null, DC_PAPERNAMES, @ m.lcBuffer, null) for m.ii = 1 to m.lnPapers laPaperName[m.ii] = substr(m.lcBuffer, (m.ii - 1) * 64 + 1, 64) endfor m.lcBuffer = replicate(chr(0), 8 * m.lnPapers) DeviceCapabilities(set('printer', 2), ; null, DC_PAPERSIZE, @ m.lcBuffer, null) for m.ii = 1 to m.lnPapers laPaperSize[m.ii] = substr(m.lcBuffer, (m.ii - 1) * 8 + 1, 8) endfor return rtrim(laPaperName[m.lnPaperId], chr(0)) + ' (' ; + transform(ctobin(left(laPaperSize[m.lnPaperId], 4), 'rs')) + ' x ' ; + transform(ctobin(right(laPaperSize[m.lnPaperId], 4), 'rs')) + ')' endfunc