С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/125: Рейтинг темы: голосов - 125, средняя оценка - 4.51
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285

Печать с использованием функции Shell

24.08.2012, 21:23. Показов 23722. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Procedure_1()
 
    Const sPathApplication As String = "C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe"
    Const sFilePath As String = "C:\Documents and Settings\Пользователь\Рабочий стол\Документ 1.pdf"
    
    'WindowStyle:=vbNormalFocus используется для виртуальных принтеров,
    'чтобы было видно диалоговое окно, которое появляется
    'когда файл отправляют на печать.
    'В случае Adobe Reader в любом случае появится диалоговое окно программы.
    'Это же происходит, если распечатать файл, щ. по нему правой кн. мыши и выбрав "Печать".
    Shell PathName:=sPathApplication & " /p /h " & sFilePath, WindowStyle:=vbNormalFocus
        
End Sub
Кроме ключей /p /h есть ещё что-нибудь?
Интересует, чтобы код переходил к следующей строке кода, только после того, как документ отправлен на принтер.
Ещё интересует, как указать конкретный принтер.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2012, 21:23
Ответы с готовыми решениями:

Разработать приложение для вывода содержимого компонента класса TMemo на печать с использованием функции Canvas
Разработать приложение для вывода содержимого компонента класса TMemo на печать с использованием функции Canvas c помощью метода TextOut.

Разработать приложение для вывода содержимого компонента класса TMemo на печать с использованием функции Canvas
Разработать приложение для вывода содержимого компонента класса TMemo на печать с использованием функции Canvas c помощью метода TextOut. ...

Вопрос по функции Shell (Dim RetVal RetVal = Shell('rar a tmp*.*', vbHide) )
Я с помощью Shell вызываю архиватор rar: Dim RetVal RetVal = Shell('rar a tmp*.*', vbHide)Вопрос: можно-ли то что обычно выводится в...

23
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.08.2012, 22:57
Есть, сделал перевод справки.

Acrobat and Acrobat Reader Command Line Reference (перевод)

Как использовать коммандную строку Windows в программах Acrobat и Acrobat Reader?

Вы можете открыть и распечатать PDF-файл с помощью командной строки Acrobat и Acrobat Reader. Эти команды официально не поддерживаются, но могут быть использованы некоторыми разработчиками. Нет никакой другой документации по этим командам, кроме приведенной ниже.

Примечание: все примеры, приведенные для Adobe Reader, также применимы к Acrobat. Если Вы используете Acrobat, подставьте в командной строке Acrobat.exe вместо AcroRd32.exe.

AcroRd32.exe pathname — запускает Adobe Reader и отображает файл. Должен быть указан полный путь к файлу.

Существуют такие ключи:

/n запускает отдельный экземпляр Acrobat или Adobe Reader, даже если он уже запущен.

/s не показывать всплывающее окно

/o не показывать диалоговое окно открытия файла

/h запускает Acrobat или Adobe Reader в минимизированном окне.

AcroRd32.exe /p pathname — Запускает Adobe Reader и показывает диалоговое окно печати.

AcroRd32.exe /t path "printername" "drivername" "portname"
Запускает Adobe Reader и печатает файл, после чего диалоговое окно печати будет закрыто. Путь должен быть указан полностью.

4-й параметр ключа /t принимает путь (path), имя принтера (printername), имя драйвера (drivername) и имя порта (portname) (все строки обязательны).

drivername — имя драйвера (указано в свойствах Вашего принтера).
portname — Имя порта принтера. Оно не должно содержать символ "/". Иначе вывод будет переадресован на порт по-умолчанию для принтера, который на нем установлен.
3
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
24.08.2012, 23:14  [ТС]
Dragokas, а порядок записи какой? Вот у меня в коде (сообщение #1) сначала идёт название программы, затем два ключа затем имя файла.


Цитата Сообщение от Dragokas Посмотреть сообщение
Эти команды официально не поддерживаются
а какая альтернатива есть? Мне вот не нравится, что никакой информации нет по синтаксису командной строки для функции Shell, а если и есть, то я даже не знаю, какой запрос делать в Гугле.
Использование объектов альтернатива? Так получается. Т.е. для решения этой задачи, по нормальному, нужно использовать объекты Acrobat и Reader? Хотя и по библиотеке для Reader нельзя найти никакой информации в интернете. Не известно, что делать, одним словом.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
25.08.2012, 00:16
Как уже писалось в Информация о pdf файле теме работа с объектами Ридера возможна только, если продукт куплен (платная версия). В бесплатную API и пр. не входят. А значит вся прелесть сходит на нет. Ваша программа на Vb будет скорей только для домашнего использования или для организаций, где такой продукт действительно используют.

Shell - умеет только вызывать программу с параметрами в окне с определенным пользователем фокусом и возвращать ID приложения, через который можно делать простые вещи, например, активировать или закрывать экземпляр. Но это выходит за рамки этой темы.

Для Вашей конкретной задачи рекомендую попробовать объект FileSystemObject. И его метод Run.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub PrintPDF()
Const sPathApplication As String = """c:\Program Files (x86)\Adobe\Reader 10.0\Reader\acrord32.exe"""
Const sFilePath As String = """e:\iac_api_reference.pdf"""
 
With CreateObject("WScript.Shell")
  'Печатаем на виртуальном принтере
  .Run sPathApplication & " /h /t " & sFilePath & """doPDF v7"" ""doPDF 7 Printer Driver"" ""DOP7""", 0, True
  'Печатаем на реальном принтере (указывать все параметры, даже если это Ваш принтер по-умолчанию)
  .Run sPathApplication & " /h /t " & sFilePath & """Canon LBP2900"" ""Canon LBP2900"" ""USB001""", 0, True
  .Run "taskkill /f /im:AcroRD32.exe", 0 'Закрыть Adobe Reader
End With
'True - сценарий возобновит работу только после завершения вызванного процесса.
End Sub
Пути замените на свои и не пренебрегайте кавычками (в данном случае в VB - двойные кавычки). Хоть Shell и проглотила пробелы в пути, в других случаях можно завести себя в мышеловку.

Немного поэкспериментировав удостоверился, некоторые ключи делают не совсем то, о чем написано в справке. Кстати другой и нет - это я нашел в официальной для разработчиков:
http://livedocs.adobe.com/acro... 22.31.html
Так вот, ключ /h - он сворачивает приложение, но только после завершения печати. Но самая главная его задача автоматически распечатывать документ без подтверждения. Без него Вы просто увидите диалоговое окно "Печать" Adobe Reader-a.

Кроме того, как Вы видите второй строкой у меня печать на принтере LBP-2900 - этот принтер установлен у меня по-умолчанию. Но после того как я указал в ком. строке - печатать через драйвер "doPDF", как бы я не пытался не указывать параметров (например, ключ /p), у меня все равно печатает на виртуальном принтере. Поэтому мне пришлось указывать ВСЕ параметры моего принтера по-умолчанию. Вот такие особенности.

Добавлено через 11 минут
P.S. doPDF кто не знает - это бесплатная программа, которая преобразовывает любой документ в формат PDF (нечто вроде печати в файл).
Здесь я ее установил для экспериментов, якобы у меня в системе несколько принтеров.
1
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
25.08.2012, 11:56  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
работа с объектами Ридера возможна только, если продукт куплен (платная версия)
нет, есть библиотеки у Adobe, с которыми можно работать с Reader. Например, контрол: Adobe PDF Reader.

Цитата Сообщение от Dragokas Посмотреть сообщение
Для Вашей конкретной задачи рекомендую попробовать объект FileSystemObject.
в сообщении #4 в коде вы используете следующее:
библиотека: Windows Script Host Object Model, объект: WshShell.


Вывод по теме: для каждой программы существует свой синтаксис командной строки. Т.е. например, для программы Foxit Reader (это программа для работы с PDF-файлами) командная строка будет другой, чем для Adobe Reader. Таким образом, запрос в Гугл для поиска синтаксиса командной строки для программы Adobe Reader может быть таким:
  1. командная строка Adobe Reader;
  2. Windows command line with Adobe Reader.


Примечание

Названия принтеров, драйверов и портов берётся отсюда:
  1. Пуск - Панель управления - Принтеры и др. оборудование - Принтеры и факсы - правая кн. мыши по принтеру - Свойства.
  2. Для сетевого принтера, в начале имени принтера добавляется два слеша, затем идёт имя компьютера, где находится сетевой принтер, затем снова слеш, а затем указывается имя принтера. При этом на конце нельзя указывать текст на ... Пример: \\имя компьютера\имя принтера.
  3. Вероятно можно печатать и без указания драйвера и порта. Достаточно указать имя принтера.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
25.08.2012, 18:39
Цитата Сообщение от Busine2012 Посмотреть сообщение
для каждой программы существует свой синтаксис командной строки.
И синтаксис, и ключи, и вообще их поддержка.
Все это добавляет программист при разработке своего приложения. К примеру, в VB переданные аргументы отображает функция Command, в С++ - argv[].

... Или ключевые слова в таком виде: "adobe reader command line call switch syntax"

WshShell, да, потому что методу Run можно задать - дожидаться завершения процесса (печати в данном случае).
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
25.08.2012, 18:42  [ТС]
Dragokas, сообщение #4. В какой строке этого кода происходит ожидание отправки документа на печать?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
25.08.2012, 20:09
За это отвечает 3-й параметр метода Run.
Он не универсален и очень зависит от поведения дочернего (вызванного) приложения. Но в данном случае свое отрабатывает на ура.
Описание:


3.4. Run

Синтаксис:
Run(<Command>,<WindowStyle>,<WaitOnRetur n>)

Назначение: создаёт новый независимый процесс, который запускает заданное приложение.

Параметры:
<Command> - строка, командная строка запуска приложения.
<WindowStyle> - необязательный, число. Определяет вид окна запускаемого приложения. Некоторые возможные значения:
0 - Не отображает окно.
1 - Активизирует и отображает окно.
2 - Активизирует окно и отображает его в свёрнутом виде.
3 - Активизирует окно и отображает его в максимизированном виде.
<WaitOnReturn> - необязательный, булево (число). True - сценарий возобновит работу только после завершения вызванного процесса. False (по умолчанию) - управление передаётся сразу обратно в сценарий.

Описание: если параметр "WaitOnReturn" установлен в True, метод возвращает код выхода вызванного приложения. Иначе метод всегда возвращает ноль.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
27.08.2012, 00:20

Не по теме:

Перед тем, как грохнулась база данных, Busine2012, Вы спрашивали, чтобы документы печатались подряд.


Отвечаю: конвейерная печать файлов действительно не проходит, поскольку после ее завершения Adobe не закрывает свое приложение, а через командную строку такого ключа нет.

Поэтому пришлось копать в сторону отслеживания очереди печати. API для этого весьма сложно.
И тут я случайно нашел в системной папке любопытный скриптик с цифровой подписью: c:\Windows\System32\Printing_Admin_Scrip ts\ru-RU\prnjobs.vbs
Подпилив его я получил такое:
Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
Option Explicit
 
Sub main()
'Const sPathAdobe As String = "c:\Program Files (x86)\Adobe\Reader 10.0\Reader\acrord32.exe"
Dim sFilePath$(1 To 2)
Dim PrinterName$, DriverName$, Port$
 
PrinterName = "Canon LBP2900"
DriverName = "Canon LBP2900"
Port = "USB001"
 
'Список файлов для печати в массив
sFilePath(1) = "e:\NVEFSRestoreTool_Manual.pdf"
sFilePath(2) = "e:\123.pdf"
 
Call PrintPDF(sFilePath, PrinterName, DriverName, Port)
End Sub
 
Sub PrintPDF(ByVal sFilePath, ByVal PrinterName$, ByVal DriverName$, ByVal Port$)
Dim WshShell As Object, sPathAdobe$, File
Set WshShell = CreateObject("WScript.Shell")
 
'Получаем путь к программе Adobe Reader через реестр
sPathAdobe = WshShell.RegRead("HKCR\Software\Adobe\Acrobat\Exe\")
 
For Each File In sFilePath 'Печатаем каждый файл через WshShell
  WshShell.Run _
  sPathAdobe & _
  " /h /t " & _
  """" & File & """ " & _
  """" & PrinterName & """ " & _
  """" & DriverName & """ " & _
  """" & Port & """", 0, False
  Call Wait_For_Printing_Complete
  Call KillTask(sPathAdobe)
Next
Set WshShell = Nothing
End Sub
 
Sub KillTask(ByVal FileName$) 'Закрыть Adobe Reader
If InStr(FileName, "\") <> 0 Then FileName = Mid$(FileName, InStrRev(FileName, "\") + 1)
CreateObject("WScript.Shell").Run "taskkill /f /im:" & FileName, 0, True
End Sub
 
Sub Wait_For_Printing_Complete() 'Слежение за очередью печати
Dim oLocator As Object, oService As Object
 
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer("", "", "", "") 'Задания от всех пользователей
 
oService.Security_.impersonationlevel = 3 'получаем необходимые права
oService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege"
 
'Ожидаем постановки в печать
Do While oService.InstancesOf("Win32_PrintJob").Count = 0
    DoEvents
Loop
 
'Ожидаем завершения печати
Do Until oService.InstancesOf("Win32_PrintJob").Count = 0
    Pause 1
Loop
 
Set oLocator = Nothing
Set oService = Nothing
End Sub
 
Sub Pause(Sec&) 'пауза в секундах
Dim t!
t = Timer
Do
    DoEvents
Loop Until Timer > t + 1 Or Timer < t
End Sub
Хотя я наверно зря старался и почти все тоже самое можно сделать, добавив ключик /n в цикл, который будет делать постановку в печать, открывая новый экземпляр Adobe Reader-a.
Вложения
Тип файла: zip Printing_Admin_Scripts.zip (60.9 Кб, 75 просмотров)
1
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
27.08.2012, 08:47  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Хотя я наверно зря старался и почти все тоже самое можно сделать, добавив ключик /n в цикл, который будет делать постановку в печать, открывая новый экземпляр Adobe Reader-a.
если на печать запускается 100 файлов, то все эти 100 файлов начнут сразу открываться, т.е. эти файлы будут отображаться в панели задач Widonws (строка внизу монитора), что уже будет ненормальным.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
27.08.2012, 10:58
Busine2012, значит есть толк в моем коде.
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
27.08.2012, 12:00  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Dragokas, порядок вывода на печать зависит от программы, с помощью которой сначала открывается файл, а затем этот файл запускается на печать. В моём случае такой программой является Adobe Reader. Поэтому, я предполагаю, что нет смысла ориентироваться в этом случае на очередь печати.

Я буду использовать отслеживание открытие и закрытие PDF-файла в программе Adobe Reader с помощью одной функции API:
Visual Basic
1
2
Declare Function FindWindowA Lib "User32.dll" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Код для распечатки двух PDF-файлов в цикле с помощью программы Adobe Reader.
Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
Option Explicit
 
'Функция для получения манипулятора окна открываемого для печати PDF-файла.
'Манипулятор - это просто число, через которое можно обратиться к нужному окну.
'Нам манипулятор нужен, чтобы:
    '1. определить, открыт ли документ PDF;
    '2. определить, закрыт ли документ PDF.
Declare Function FindWindowA Lib "User32.dll" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Sub Procedure_1()
 
    'Путь к программе Adobe Reader.
    Const sAppPath = "C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe"
    
    Dim sPrinterName As String
    Dim sArray(1 To 2) As String
    Dim i As Long
    
    Dim apiHWnd As Long
    Dim apiWindowHeader As String
    
    'Указываем имя принтера. Имя принтера можно посмотреть:
    'Пуск - Панель управления - Принтеры и другое оборудование - Принтеры и факсы.
    'Добавляем кавычки к имени принтера, чтобы сформировать командную строку.
    'Кавычки нужно использовать, чтобы компьютер различал, где указано имя файла,
    'а где имя принтера.
    'Chr(34) - это кавычки.
    sPrinterName = Chr(34) & "doPDF v7" & Chr(34)
    
    'Указываем, какие файлы распечатывать.
    sArray(1) = "C:\Documents and Settings\Пользователь\Рабочий стол\Файлы PDF\Документ 1.pdf"
    sArray(2) = "C:\Documents and Settings\Пользователь\Рабочий стол\Файлы PDF\Документ 2.pdf"
    
    'Распечатываем PDF-файлы.
    
    For i = 1 To UBound(sArray) Step 1
    
        'Запуск PDF-файла на печать.
        'vbNormalFocus - для виртуальных принтеров, чтобы было видно
        'диалоговое окно печати.
        Shell sAppPath & " /t" & Chr(34) & sArray(i) & Chr(34) & sPrinterName, vbNormalFocus
        
        'Указываем, какой заголовок окна нас интересует.
        apiWindowHeader = Dir(sArray(i)) & " - Adobe Reader"
    
        'Ждём, когда на мониторе появится окно PDF-файла
        '(вверху этого окна будете соответствующий текст,
        'например: "Документ 1.pdf - Adobe Reader".
        Do
            apiHWnd = FindWindowA(vbNullString, apiWindowHeader)
            If apiHWnd <> 0 Then
                Exit Do
            End If
            'Хоть печать и осуществляется в другой программе (Adobe Reader),
            'цикл не даёт открыться окну PDF-файла, поэтому нужно добавить DoEvents.
            DoEvents
        Loop
    
        'Ждём, когда закроется открытый для печати PDF-документ.
        'В этом случае на мониторе не станет окна с заголовком PDF-документа.
        Do
            apiHWnd = FindWindowA(vbNullString, apiWindowHeader)
            If apiHWnd = 0 Then
                Exit Do
            End If
            DoEvents
        Loop
        
    Next i
    
End Sub
Никогда раньше на работал с API-функциями, поэтому не знаю, будет ли работать такая схема или нет, я только на цикле из двух 2 файлов тестировал. При этом компьютер начинает шуметь при выполнении кода, я так думаю, что из-за циклов Do ... Loop, которые напрягают почему-то компьютер.

Примечание: не известно, успеет ли функция FindWindowA определить, что PDF-документ открылся: вдруг PDF-документ очень быстро откроется и закроется.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
27.08.2012, 12:55
Цитата Сообщение от Busine2012 Посмотреть сообщение
я предполагаю, что нет смысла ориентироваться в этом случае на очередь печати.
Она работает немного по-другому.
У меня в очередь печати никогда не отправляется более 1 документа.
Сначала цикл запускает на печать первый.
Затем беспрерывно отслеживает момент, когда документ появится в задании печати.
Далее с паузой в 1 секунду отслеживает момент, когда печать задания завершиться и очередь печати очистится.
После этого убивает процесс Adobe Reader.
Цикл начинается заново.

Цитата Сообщение от Busine2012 Посмотреть сообщение
вдруг PDF-документ очень быстро откроется и закроется.
Да, мне тоже пришлось учесть этот момент, только реализация другая.

Цитата Сообщение от Busine2012 Посмотреть сообщение
из-за циклов Do ... Loop, которые напрягают почему-то компьютер.
Попробуй еще добавить в строку 67 паузу, как у меня. Желательно взять даже спец. API-функцию Sleep. Она там простенькая. Не должна напрягать.

Держи + за идею.

Добавлено через 11 минут
P.S. Возникли вопросы:
1. Как у Вас ведет себя Adobe Reader - он меняет заголовок окна после того, как все страницы 1-го документа будут распечатаны или сразу после постановки документа в очередь печати?
2. Сколько страниц Вы отправляли на печать?
3. У Вас разве приложение Adobe Reader само закрывается после завершения печати?
1
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
27.08.2012, 13:39  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
1. Как у Вас ведет себя Adobe Reader - он меняет заголовок окна после того, как все страницы 1-го документа будут распечатаны или сразу после постановки документа в очередь печати?
Если программа Adobe Reader открыта, но PDF-файлы не открыты, то заголовок содержит имя файла и Adobe Reder. Если программа Adobe Reader открыта и открыт PDF-файл, или если вообще не открыт Adobe Reader, то открывается новое окно, в заголовке которого имя файла и Adobe Reder.
Цитата Сообщение от Dragokas Посмотреть сообщение
2. Сколько страниц Вы отправляли на печать?
В каждом PDF-файле по одной странице. Сейчас добавил в один PDF-файл ещё одну страницу и в одном PDF-файле стало 2 страницы.

Цитата Сообщение от Dragokas Посмотреть сообщение
3. У Вас разве приложение Adobe Reader само закрывается после завершения печати?
Нет, не закрывается, но это так запрограммировано программистами из организации Adobe. Потому что если даже правой кн. мыши распечатать PDF-файл, то программа Adobe Reader не закрывается.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
27.08.2012, 14:09
А будет ли отрабатывать правильно эта API при большем кол-ве листов, или отправит все документы в очередь габузом.
Это можно увидеть, если открыть окно очереди печати принтера и запустить Ваш макрос, отправив на печать документы в описанном Вами порядке: 1) с 2 страницами 2) с 1 страницей.
Просто у меня сейчас нет возможности проверить.
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
27.08.2012, 14:50  [ТС]
Dragokas, в сообщении #12 в коде PDF-документ открыт только до тех пор, пока в диалоговом окне очереди печати есть текст Постановка в очередь. Когда в диалоговом окне с очередью печати появляется состояние Идет печать, то PDF-документ закрывается, но продолжает печататься и открывается следующий PDF-документ для печати. Т.е. при моём коде будет заполняться очередь печати.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
27.08.2012, 15:56
Ясно. Да, так вероятно, более логичней запускать. Иначе зачем придумали очередь.
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
27.08.2012, 16:22  [ТС]
Dragokas, я бы посмотрел ваше сообщение #9, то это опять надо кучи информации смотреть в интернете и на английском языке по библиотекам WScript.Shell и WbemScripting.SWbemLocator. Хотелось бы осознанно коды писать, а чтобы разобраться с вашим кодом, нужно смотреть много информации.

Меня в моём коде сейчас не устраивает только одно: вдруг функция FindWindowA пропустит открытие файла. Сейчас думаю такой вариант: открывать PDF-файл, затем что-то делать, чтобы документ отправлялся на печать, получить сигнал, что документ отправлен на печать, закрыть документ. Но думаю, что это сложно и уже не буду, наверное, разбирать.

В моём коде, если функция FindWindowA пропустит открытие файла, то код встанет, поэтому пользователь будет знать, что что-то не так пошло. В принципе вот такая защита от ошибки.
0
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 12
29.08.2012, 09:14
И что печатает?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
29.08.2012, 13:18
Цитата Сообщение от Guest89 Посмотреть сообщение
И что печатает?
в каком смысле ???

Busine2012, поставь в первом цикле дополнительным условием выхода тайм-аут, скажем, в 10 секунд. Между завершением постановки на печать и открытием диалога печати в новом документе врядли может пройти большее время, если документ не гигантских размеров.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2012, 13:18
Помогаю со студенческими работами здесь

Shell-процедура для ввода слов и вывода на печать.
Помогите пожалуйста разработать shell-процедуру (bash) выполняющую: 1. Ввод заданного параметром число слов. 2. Выводит каждое слово на...

Remote Shell и Local Shell для Windows
Привет всем. Хочу научиться писать Local Shell и Remote Shell код на masm. Для начало хочу с простова вызывать функцию MessageBox.

Печать StringGrid с использованием PrintDialog
Подскажите пожалуйста как напечатать StringGrid с помощью PrintDiflog? Или может быть лучше Перенаправлять таблицу в Excel или Word?...

Составьте программу на языке Shell, использующую функции
Кто поможет с заданием - Составьте программу на языке Shell, использующую функции.

Написать программу с использованием функции и с использованием макроса
Составить две программы вычисления функции F и сравнить результаты ***** - Используя объявления макроса; ***** - Используя обращение к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru