Как вы управляете выбором лотка принтера для принтера в Windows? - PullRequest
5 голосов
/ 03 октября 2008

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

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

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

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

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

РЕДАКТИРОВАТЬ: Вот ссылка на документацию DEVMODE Документация DEVMODE

РЕДАКТИРОВАТЬ: Я должен также указать, что мы ищем общее решение, а не что-то конкретное для конкретного принтера (мы развертываем во многих, многих средах)

Ответы [ 5 ]

2 голосов
/ 29 мая 2012

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

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

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

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

1 голос
/ 26 января 2009

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

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

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

1 голос
/ 07 октября 2008

Настройка таких функций может быть сложной, особенно если драйвер не соответствует указаниям Microsoft по печати. При этом мы добились определенного успеха с System.Drawing.Printing.PrinterSettings. Вы можете установить PaperSource, но я не уверен, что вы можете установить значения по умолчанию.

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

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

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

0 голосов
/ 03 октября 2008

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

Для принтеров HP я нашел по адресу: http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&cc=us&objectID=bpl07282&jumpid=reg_R1002_USEN некоторые команды PJL (некоторые тоже относятся к лотку).

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

0 голосов
/ 03 октября 2008

Недавно мне пришлось сделать что-то очень похожее для драйвера принтера , и для этого потребовался SDK для конкретного поставщика. Кажется, что этот лоток не отображается в DEVMODE или любой другой структуре PRINTINFO_ *, поэтому я полагаю, что отправлю электронное письмо поставщику принтера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...