2008-10-03 2 views
4

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

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

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

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

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

EDIT: Вот ссылка для DEVMODE документации DEVMODE documentation

EDIT: Я хотел бы также отметить, что мы ищем общее решение - не что-то конкретное для конкретного принтера (мы разместим во многих, многих средах)

ответ

1

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

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

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

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

+0

Не думаю, что вам было бы интересно расширить свой ответ? Как вы захватываете текущий DEVMODE? Как заменить его на сохраненный? – 2012-12-12 14:57:31

0

Я должен был сделать что-то очень похожее недавно на specific printer driver, и для этого потребовался SDK для конкретного поставщика. Лоток, кажется, не появляется в DEVMODE или в любой другой структуре PRINTINFO_ *, поэтому я думаю, что я отдам электронное письмо поставщику принтера.

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

+0

DEVMODE имеет два параметра (dmDefaultSource и dmFormName), которые, как представляется, управляют лотком. Я неверно истолковываю, что контролируют эти члены? – 2008-10-03 15:56:08

0

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

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

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

1

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

Если вы еще не видели этот пример, вы можете захотеть посмотреть его дальше. В нем описывается метод хранения и перезагрузки параметров принтера. Один из моих ребят указал мне на это: PrinterSettings - Changing, Storing and Loading Printer Settings

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

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

+0

Это хорошая ссылка для настроек, связанных с текущим приложением. Если мое приложение запускает задания печати, оно будет работать отлично. Но мы поручаем другому приложению инициировать задание на печать, поэтому нам нужно либо изменить настройки в другом приложении, либо изменить настройки системы по умолчанию. – 2008-10-08 03:25:27

1

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

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

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

+0

Это выглядит довольно многообещающе - я отправлю обратно, когда смогу подняться на воздух и дать ему вихрь - спасибо! – 2009-02-24 04:47:47

Смежные вопросы