Как вы получаете текущую настройку размеров этикетки для принтера Zebra - PullRequest
0 голосов
/ 17 октября 2019

Я делаю приложение для доступа, которое печатает два размера этикетки: 3 "ширина на 2" высота, а затем 1,5 "ширина на 1" высота. Это приложение будет работать на нескольких разных компьютерах, которые не имеют одинаковых наборов принтеров, например, на машине 1 может быть GC420d, GK420d и обычный принтер 8,5x11, затем на машине 2 может быть LP 2844, GC420d иобычный принтер 8.5x11. Машины распространены по всей производственной среде, и мы не можем стандартизировать тип принтера. Таким образом, это оставляет меня там, где мне нужно иметь возможность определить, какой принтер имеет настройки 3 "x 2", а какой - 1,5 "на 1".

РЕДАКТИРОВАТЬ: я знаю, что это выглядит как "IЯ ничего не пробовал и мне лень пробовать "ситуацию", но весь код, который я потерял, потерпел крах при доступе к рабочему столу. В основном я пробовал Win API, например, DeviceCapabilities , но не смог получить ничего полезного. перечисление пользовательских типов бумаги бесполезно, когда я не вижу фактических размеров пользовательского типа бумаги. Затем я попытался DocumentProperties , что потребовало OpenPrinter , чтобы получить ручку принтера. Вот вещи, которые взорвали все стороны доступа. я использовал этот веб-сайт для получения вызовов API для VBA.

EDIT2: это возвращение для типа бумаги в соответствии с доступом.

?application.Printers(0).DeviceName
ZDesigner GC420d (EPL)
?application.Printers(0).PaperSize
 256 

1 Ответ

4 голосов
/ 17 октября 2019

Вы можете использовать ниже список всех поддерживаемых названий бумаги и их соответствующие размеры:

Private Enum DeviceCapabilitiesFlags
    DC_FIELDS = 1
    DC_PAPERS = 2
    DC_PAPERSIZE = 3
    DC_MINEXTENT = 4
    DC_MAXEXTENT = 5
    DC_BINS = 6
    DC_DUPLEX = 7
    DC_SIZE = 8
    DC_EXTRA = 9
    DC_VERSION = 10
    DC_DRIVER = 11
    DC_BINNAMES = 12
    DC_ENUMRESOLUTIONS = 13
    DC_FILEDEPENDENCIES = 14
    DC_TRUETYPE = 15
    DC_PAPERNAMES = 16
    DC_ORIENTATION = 17
    DC_COPIES = 18
    DC_BINADJUST = 19
    DC_EMF_COMPLIANT = 20
    DC_DATATYPE_PRODUCED = 21
    DC_COLLATE = 22
    DC_MANUFACTURER = 23
    DC_MODEL = 24
    DC_PERSONALITY = 25
    DC_PRINTRATE = 26
    DC_PRINTRATEUNIT = 27
    DC_PRINTERMEM = 28
    DC_MEDIAREADY = 29
    DC_STAPLE = 30
    DC_PRINTRATEPPM = 31
    DC_COLORDEVICE = 32
    DC_NUP = 33
    DC_MEDIATYPENAMES = 34
    DC_MEDIATYPES = 35
End Enum

Private Type POINT
    x As Long
    y As Long
End Type

Private Declare Function DeviceCapabilities _
  Lib "winspool.drv" _
    Alias "DeviceCapabilitiesA" _
      (ByVal lpDeviceName As String, _
       ByVal lpPort As String, _
       ByVal iIndex As Long, _
       ByRef lpOutput As Any, _
       ByRef lpDevMode As Any) _
    As Long

Private Declare Function StrLen _
  Lib "kernel32.dll" _
    Alias "lstrlenA" _
      (ByVal lpString As String) _
    As Long

Public Sub ListSupportedPaperSizes()
    Dim defaultPrinter() As String
    Dim paperCount As Long
    Dim NameArray() As Byte
    Dim i As Long
    Dim paperNames() As String
    Dim paperName As String
    Dim ctr As Long

    defaultPrinter = Split(Application.ActivePrinter, " on ")
    paperCount = DeviceCapabilities(defaultPrinter(0), defaultPrinter(1), DC_PAPERSIZE, ByVal 0&, ByVal 0&)
    ReDim paperNames(1 To paperCount)
    ReDim NameArray(0 To paperCount * 64) As Byte
    ' Get paper names
    paperCount = DeviceCapabilities(defaultPrinter(0), defaultPrinter(1), DC_PAPERNAMES, NameArray(0), 0)
   'convert the retrieved byte array to an ANSI string
    AllNames = StrConv(NameArray, vbUnicode)
    ReDim paperNames(1 To paperCount)
    'loop through the string and search for the names of the papers
    For i = 1 To Len(AllNames) Step 64
        ctr = ctr + 1
        paperName = Mid(AllNames, i, 64)
        paperName = Left(paperName, StrLen(paperName))
        If paperName <> vbNullString Then
            paperNames(ctr) = paperName
        End If
    Next i

    ReDim PaperSizes(1 To paperCount) As POINT
    paperCount = DeviceCapabilities(defaultPrinter(0), defaultPrinter(1), DC_PAPERSIZE, PaperSizes(1), 0)
    For i = 1 To paperCount
        Debug.Print paperNames(i) & " : " _
            & Format(PaperSizes(i).x / 254, "0.00") & " x " _
            & Format(PaperSizes(i).y / 254, "0.00") _
            & " inch"
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...