Мониторинг очереди печати без использования взаимодействия / неуправляемого кода - PullRequest
7 голосов
/ 26 января 2012

Справочная информация:

Я пишу приложение на C #, используя .NET 4.0. Он печатает кучу документов в определенном порядке. Документы бывают разных типов и фактически печатаются с использованием ShellExecute с глаголом «печать».

Чтобы убедиться, что заказ не перепутан, я хотел бы изучить очередь печати для используемого принтера. Мой основной цикл будет выглядеть так:

  1. Вызвать действие «печать» на документе
  2. Подождите, пока документ появится в очереди на печать
  3. Повторите, пока не будет сделано

Как контролировать очередь печати с помощью управляемого кода?

Я нашел несколько замечательных примеров выполнения аналогичных действий с помощью неуправляемых вызовов (например: http://blogs.msdn.com/b/martijnh/archive/2009/08/05/printmonitor-a-c-print-spooler-monitor.aspx).. Кроме того, я знаю, как смотреть на буферные файлы в c: \ windows \ system32 \ spool ... и вычислять вещи таким образом.

Как бы то ни было, ни одно из этих решений не очень удовлетворяет ... с количеством неуправляемой трески, которую я звоню, я чувствую, что должен просто написать приложение на C ++. (И не иметь .NET зависимость / накладные расходы.)

Основной вопрос: неужели нет способа отслеживать очередь печати, используя только управляемые вызовы?

Более общий вопрос: я родом из мира java и обычно использую языки .NET только тогда, когда я хочу сделать что-то для конкретной ОС или что-то, что должно взаимодействовать с другими вещами в мире MS. (Например, компоненты служб SSIS.)

Кажется, что каждый раз, когда я запускаю проект, я оказываюсь в одном и том же беспорядке: всевозможные вызовы собственных функций, COM-компоненты и т. Д. И т. Д.

Вторичный вопрос: Есть ли что-то, чего мне не хватает в философии или реализации .NET? (Я просто недостаточно стараюсь, чтобы управляемые библиотеки могли что-то делать? Является ли .NET неправильным выбором для всего, что нужно для Windows-специфических вещей, таких как манипулирование очередью печати?) Я получаю (или думаю, что получаю) это Теоретически предполагается, что .NET не зависит от ОС, но, безусловно, в большинстве современных операционных систем есть принтеры, очереди печати и тому подобное. (Таким образом, если бы у вас были общие вызовы для выполнения подобных вещей, они могли бы быть реализованы в версии платформы каждой платформы ..)

1 Ответ

6 голосов
/ 26 января 2012

Основной вопрос: взгляните на класс PrintQueue и LocalPrintServer в пространстве имен System.Printing .

Вторичный вопрос: .NET не был написан, чтобы быть независимым от ОС (без моно), он был написан, чтобы быть независимым от версии Windows. Хотя было бы неплохо иметь дело только с управляемыми объектами и управляемыми вызовами, я считаю это несколько нереалистичным ожиданием. Огромный размер и объем существующих функций C и COM, предоставляемых Windows, делают обертку все сложной задачей. Я уверен, что у Microsoft есть куча разработчиков, но я бы сказал, что окупаемость инвестиций для такого предприятия довольно низкая, учитывая относительно простую в использовании поддержку COM & P / Invoke.

...