Как вы управляете выбором лотка принтера для принтера в Windows

#windows #visual-c #printing

Вопрос:

Нам нужно иметь возможность изменить выбранный по умолчанию лоток для печати данного принтера. У кого-нибудь есть код VC /win32 для этого?

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

Мы бы действительно предпочли, чтобы значения по умолчанию изменялись только для текущего пользователя, и не требовали какого-либо специального повышения уровня контроля учетных записей и т. Д…

Я подозреваю, что он будет использовать что-то похожее на то, что показано в этой статье MSDN, и будет включать в себя настройку полей в структуре DEVMODE (либо dmDefaultSource, либо dmFormName, либо и то, и другое).

Есть желающие? Или у кого-нибудь есть какие-нибудь идеи, которыми они хотели бы поделиться?

ИЗМЕНИТЬ: Вот ссылка на документацию по режиму разработки Документация по режиму разработки

ПРАВКА: Я должен также отметить, что мы ищем общее решение, а не что — то конкретное для конкретного принтера (мы развертываем во многих, многих средах).

Ответ №1:

К вашему сведению, решение, которое мы использовали, состояло в том, чтобы захватить структуру DEVMODE. У нас есть небольшое приложение win32, которое представляет диалоговое окно настроек принтера (через DocumentProperties с fMode, установленным в DM_IN_PROMPT). Полученный в результате режим разработки затем сохраняется на диске. Когда мы выполняем печать, мы фиксируем текущий РЕЖИМ разработки, устанавливаем сохраненный РЕЖИМ разработки, запускаем печать, а затем восстанавливаем исходный РЕЖИМ разработки.

На самом деле это работает довольно хорошо. Иногда драйверы печати обновляются и приводят к нарушению сохраненного режима разработки, но это происходит не очень часто, и пользователям достаточно легко исправить это.

В качестве дополнительного бонуса этот подход позволяет нам фиксировать ВСЕ настройки принтера (а не только выходной лоток), поэтому мы смогли поддерживать расширенные настройки, такие как сшивание, сортировка и т.д…

Совет: Если вы попытаетесь это сделать, обязательно запишите на диск в виде двоичного выходного потока. При моей первоначальной оценке этого подхода я случайно настроил выходной поток как поток вывода текста. Во многих случаях все будет работать нормально, а затем внезапно сломается для некоторых принтеров (которые использовали байты высокого порядка в своих личных данных в режиме разработки). Глупая, но легкая ошибка, которую можно было совершить — и которая на некоторое время сняла со стола очень хорошее решение.

Комментарии:

1. Я не думаю, что вас заинтересует более подробный ответ на ваш вопрос? Как вы фиксируете текущий РЕЖИМ разработки? Как вы заменяете его на сохраненный?

2. Конечно — вы используете свойства DocumentProperties с другим значением для fMode

3. Эта ссылка содержит еще некоторое описание и некоторый пример кода на C#. nicholas.piasecki.name/blog/2008/11/…

Ответ №2:

Настройка подобных функций может быть сложной, особенно если драйвер не соответствует рекомендациям Microsoft по печати. Тем не менее, у нас был некоторый успех с Системой.Рисование.Печатание.Наборы принтеров. Вы можете установить PaperSource, но я не уверен, что вы можете установить значения по умолчанию.

Если вы еще не видели этот пример, возможно, вам захочется взглянуть на него подробнее. В нем описывается способ сохранения и перезагрузки настроек принтера. Один из моих парней указал мне на это: Настройки принтера — Изменение, хранение и загрузка настроек принтера

Другой метод, который может сработать, но может и не сработать для вас, состоит в том, чтобы определить несколько необходимых вам настроек. Установите принтер с каждой из этих настроек (например, Лоток 1, Лоток 2). Затем просто включите принтер по умолчанию для печати. Не то, что вы ищете, но это может помочь.

Что мы обычно делаем в таких ситуациях, так это заставляем стороннее приложение записывать данные в папку, которую мы отслеживаем, затем мы забираем файл и сами анализируем Postscript или PCL, меняем лоток для бумаги, а затем отправляем на целевое устройство. Намного проще, чем это может показаться.

Комментарии:

1. Это хороший справочник по настройкам, связанным с текущим приложением. Если бы мое приложение инициировало задания на печать, оно работало бы идеально. Но мы поручаем другому приложению инициировать задание печати, поэтому нам нужно либо изменить настройки в другом приложении, либо изменить общесистемные настройки по умолчанию.

Ответ №3:

dmDefaultSource управляет лотком. К сожалению, значения, которые вы хотите установить, различаются в зависимости от вашего драйвера, так как это номер ячейки и не обязательно совпадает с номером лотка#, напечатанным на вашем принтере.

Следующая ссылка содержит некоторый код VB6 для сбора информации о назначениях лотков/ящиков для принтеров. Вы можете использовать эту информацию для программного назначения dmDefaultSource соответствующему bin # для лотка. В основном вам нужно использовать возможности устройств для возврата информации о ваших принтерах, а затем выполнить поиск строки (например, «Лоток 1»), чтобы получить соответствующий номер ячейки.

http://support.microsoft.com/kb/194789

Комментарии:

1. Это выглядит довольно многообещающе — я отправлю ответ, когда смогу выйти на воздух и подышать воздухом — спасибо!

Ответ №4:

Недавно мне пришлось сделать что-то очень похожее для конкретного драйвера принтера, и для этого требовался пакет SDK конкретного поставщика. Лоток, похоже, не отображается ни в режиме разработки, ни в других структурах для ПЕЧАТИ_*, поэтому я думаю, что отправлю электронное письмо поставщику принтера.

В качестве последнего средства я могу придумать два возможных взлома. Один из них заключается в автоматизации драйвера на уровне графического интерфейса с помощью скриптового инструмента, такого как AutoIt. Во-вторых, нужно сбросить реестр в файл, изменить настройки драйвера, снова сбросить реестр и сравнить различия (может сработать, а может и не сработать).

Комментарии:

1. У DEVMODE есть два параметра (dmDefaultSource и dmFormName), которые, похоже, управляют треем. Я неправильно истолковываю то, что контролируют эти члены?

Ответ №5:

Насколько я знаю, принтерами управляет драйвер принтера, отправляя им команды SNMP или PJL. Но не все принтеры полностью реализуют эти наборы команд.

Для принтеров HP, которые я нашел по адресу: http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=enamp;cc=usamp;objectID=bpl07282amp;jumpid=reg_R1002_USEN некоторые команды PJL (некоторые из них также связаны с лотком).

Я не уверен, что это поможет, но примите это как подсказку для будущих поисков…