powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как распечатать на определенном принтере
2 сообщений из 2, страница 1 из 1
Как распечатать на определенном принтере
    #39919694
Игорь1973
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прежде всего надо уметь как-то перебрать все доступные принтеры.
У каждого должен быть какой-то уникальный идентификатор. Как его получить? WMI ?
Ну, и возможно ли распечатывать с временной заменой дефолтового принтера на заданный, а затем обратно восстановить дефолтовый.
Как все это реализовать на VB6?

Вижу чей-то такой код:

Код: vbnet
1.
2.
Set oPrinter = VB.Printer 'VB6 Printer object
lShellExecuteResult = ShellExecute(frmMain.hwnd, "print", sTargetFile, "", "", SW_SHOWMINNOACTIVE)
...
Рейтинг: 0 / 0
Как распечатать на определенном принтере
    #39919726
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь1973,

Если File + ShellExecute, то "printto", а не "print" и имя принтера можно указать явно.
Но регистрация "printto" в системе для данного типа файла на вашей совести и на новых Win10/8.1 по дефолту ну очень не гарантирована.

Выдрал старый код из контекста. Лет 5 уже на VB6 ничего нового не пишу.
Суть, выводит системное окно выбора принтера и распечатывает на выбранный принтер.
Я выделил место в коде.
lReturn <= 32 ошибка
у меня код заточен под печать картинки, поэтому если "printto" не сработал, я пытаюсь еще через API к штатному ImageViewer распечатать

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Public Sub DoFilePrint(ByVal FileToPrint As String, Optional ByVal hwnd As Long = 0)
  Dim the_PrintDlg As PRINTDLG
  Dim the_DevName As DEVNAMES
  Dim lpDevName As Long
  Dim bReturn As Integer
  Dim LongPrinterName As String
  Dim lVal As Long
  
  Dim the_DevMode As DEVMODE
  Dim lpDevMode As Long

  If hwnd <> 0 Then
    the_PrintDlg.hwndOwner = hwnd
  End If
  the_PrintDlg.lStructSize = Len(the_PrintDlg)
  the_PrintDlg.Flags = PD_NOSELECTION Or PD_HIDEPRINTTOFILE Or PD_NOPAGENUMS Or PD_USEDEVMODECOPIES
  
  With the_DevName
    .wDriverOffset = 8
    .wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
    .wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
    .wDefault = 0
  End With
  With Printer
    the_DevName.extra = .DriverName & Chr(0) & _
     .DeviceName & Chr(0) & .Port & Chr(0)
  End With
  the_PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(the_DevName))
  lpDevName = GlobalLock(the_PrintDlg.hDevNames)
  If lpDevName > 0 Then
    CopyMemory ByVal lpDevName, the_DevName, Len(the_DevName)
    bReturn = GlobalUnlock(lpDevName)
  End If
  
  If PrintDialog(the_PrintDlg) <> 0 Then
    '
    ' Mike's amendment to handle long printer names
    CopyMemory the_DevName, ByVal lpDevName, Len(the_DevName)
    LongPrinterName = Mid$(the_DevName.extra, _
     the_DevName.wDeviceOffset - the_DevName.wDriverOffset + 1)
    LongPrinterName = Left$(LongPrinterName, _
     InStr(LongPrinterName, Chr$(0)) - 1)
        
    lpDevName = GlobalLock(the_PrintDlg.hDevNames)
    CopyMemory the_DevName, ByVal lpDevName, 45
    bReturn = GlobalUnlock(lpDevName)
    GlobalFree the_PrintDlg.hDevNames
      
    Dim lReturn As Long
    lReturn = ShellExecute(0, "printto", FileToPrint, CStr(Chr(34) & LongPrinterName & Chr(34)), 0, SW_SHOWNORMAL)
    If lReturn <= 32 Then 'ошибка printto
      'rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "%1" "%2" "%3" "%4"
      On Error Resume Next 'например при отсутствии shimgvw.dll по каким-то причинам
      ImageView_PrintTo 0, 0, _
       "/pt " & _
       Chr(34) & FileToPrint & Chr(34) & " " & _
       Chr(34) & LongPrinterName & Chr(34), _
       0
    End If
  End If
End Sub



>Прежде всего надо уметь как-то перебрать все доступные принтеры
Это как раз просто
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Dim x As Printer
  For Each x In Printers
    If x.DeviceName = "MyPrinter" Then
      IsMyPrinter = True
      Exit For
    End If
  Next



>Ну, и возможно ли распечатывать с временной заменой дефолтового принтера на заданный, а затем обратно восстановить дефолтовый.
Дурная идея, посещавшая меня лет 15++ назад, когда программировал чисто утилиты для своей тогдашней работы.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как распечатать на определенном принтере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]