Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 314

/ вопрос открыт /

День добрый! Как перехватить документ, посланный на печать? То есть моя прога должна висеть в памяти и ждать. Когда кто-нибудь отправит на печать документ, она его перехватит, обработает, и снова пошлёт на печать.
Как я себе это представляю, когда документ посылают на печать, посылается какое-то сообщение вроде wm_ПослалиДокументНаПечать, потом документ копируется куда-то, его оттуда уже берёт драйвер и печатает. Вопрос в том, действительно ли это так, если да, то какого типа надо ставить хук, какие сообщения ловить, и где найти отправленый на печать файл.

Iskatel Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Iskatel (статус: Посетитель)
Вопрос отправлен: 17 января 2009, 17:58
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 20 января 2009, 13:31; участников в обсуждении: 3.
DNK

DNK (статус: Студент), 18 января 2009, 12:38 [#1]:

В Windows существует служба "Диспетчер очереди печати". Чтобы управлять ею почитайте следующие статьи из группы "Принтеры и Печать" ( http://www.delphiworld.narod.ru/_os_.html ):
* Как определить количество заданий на печать
* Как получить информацию о заданиях на принтере
* Как прочитать очередь печати
* Прерывание работы принтера
"Digital Networked Knight"
Iskatel

Iskatel (статус: Посетитель), 18 января 2009, 23:00 [#2]:

прочитал. Там нет ответов на главные вопросы:
Как получить путь к файлу, который отправлен на печать? EnumJob позволяет получить лишь имя файла, но не путь к нему.
Как не дать распечатать этот файл? Мне надо распечатать ИЗМЕНЕННЫЙ ФАЙЛ, оригинальный файл печатать не надо!
DNK

DNK (статус: Студент), 18 января 2009, 23:39 [#3]:

Имено поэтому я и не вписал этот пост в ответы. Даю вам, так сказать, направление.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 19 января 2009, 00:03 [#4]:

Цитата:

Как получить путь к файлу, который отправлен на печать

А в общем случае никак. Не думали о том, что можно например напечатать документ, который не был сохранён. И как изволите получить имя файла?
В целом процесс печати происходит где то так. Ворд/Эксель или любая другая программа, которой надо распечатать что то, вначале "печатает" на виртуальных листах. А потом всё это отправляется диспетчеру печати. Диспетчер печати ничего не знает о именах файлов и даже представления не имеет, как печатать документы. Он умеет выводить на печать только специально подготовленные задания.
А то, что Вы можете узнать имя файла, без пути - так это чистой воды везение. Просто многие программы не утруждают себя, да и пользователю проще, и устанавливают имя задания равным имени файла. Если делать печать самостоятельно, то можно установить там всё что заблагорассудиться (ну не абсолютно всё, но например "тихо, идет печать" можно:) ).
По этому у Вас есть такая возможность - надо написать свой драйвер принтера. К сожалению модифицировать документ можно будет только в пределах страниц. То есть, наложить "водяной знак" или вывести колонтитул - пожалуйста, но не править текст (но в некоторых случаях всё таки это возможно).
Можно просто написать перехват функций для работы с принтером, но кто гарантирует, что очередная поделка от какого то самоучки не пойдёт в обход?

И что бы окончательно развеять Ваши сомнения, что не драйвер принтера печатает документы, которые "копируются куда то", приведу простой пример. Можно в uses добавить модуль printers. Станет доступным глобальный объект Printer. У него есть канва, на которой можно рисовать, как на обычной форме/Image. Вот только надо давать команды BeginDoc и EndDoc (вроде не ошибся в написании) для начала и конца страницы.
Галочка "подтверждения прочтения" - вселенское зло.
Iskatel

Iskatel (статус: Посетитель), 20 января 2009, 13:26 [#5]:

Как я понимаю, файл, передаваемый спулеру, имеет формат EMF. Где создается этот файл? И самое главное, как там хранится документ? Как набор картинок? Для каждой страницы- своя картинка?
Вадим К

Вадим К (статус: Академик), 20 января 2009, 13:31 [#6]:

а кто сказал, что это будет EMF. Я об этом не говорил. Вообще то это проблема винды, и Вас она волновать не должна.
Где создаётся? может в памяти... опять это волновать не должно.
Открываейте MSDN и читайте. может и проясниться. Но мне кажеться, что вы у вас не тот ход мыслей, не в ту сторону.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.