|
Вопрос # 2 314/ вопрос открыт / |
|
День добрый! Как перехватить документ, посланный на печать? То есть моя прога должна висеть в памяти и ждать. Когда кто-нибудь отправит на печать документ, она его перехватит, обработает, и снова пошлёт на печать.
Как я себе это представляю, когда документ посылают на печать, посылается какое-то сообщение вроде wm_ПослалиДокументНаПечать, потом документ копируется куда-то, его оттуда уже берёт драйвер и печатает. Вопрос в том, действительно ли это так, если да, то какого типа надо ставить хук, какие сообщения ловить, и где найти отправленый на печать файл.
 |
Вопрос задал: Iskatel (статус: Посетитель)
Вопрос отправлен: 17 января 2009, 17:58
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 20 января 2009, 13:31; участников в обсуждении: 3.
|
DNK (статус: Студент), 18 января 2009, 12:38 [#1]:
В Windows существует служба "Диспетчер очереди печати". Чтобы управлять ею почитайте следующие статьи из группы "Принтеры и Печать" ( http://www.delphiworld.narod.ru/_os_.html ):
* Как определить количество заданий на печать
* Как получить информацию о заданиях на принтере
* Как прочитать очередь печати
* Прерывание работы принтера
"Digital Networked Knight"
|
|
Iskatel (статус: Посетитель), 18 января 2009, 23:00 [#2]:
прочитал. Там нет ответов на главные вопросы:
Как получить путь к файлу, который отправлен на печать? EnumJob позволяет получить лишь имя файла, но не путь к нему.
Как не дать распечатать этот файл? Мне надо распечатать ИЗМЕНЕННЫЙ ФАЙЛ, оригинальный файл печатать не надо!
|
|
DNK (статус: Студент), 18 января 2009, 23:39 [#3]:
Имено поэтому я и не вписал этот пост в ответы. Даю вам, так сказать, направление.
"Digital Networked Knight"
|
|
Вадим К (статус: Академик), 19 января 2009, 00:03 [#4]:
Цитата:
Как получить путь к файлу, который отправлен на печать
А в общем случае никак. Не думали о том, что можно например напечатать документ, который не был сохранён. И как изволите получить имя файла?
В целом процесс печати происходит где то так. Ворд/Эксель или любая другая программа, которой надо распечатать что то, вначале "печатает" на виртуальных листах. А потом всё это отправляется диспетчеру печати. Диспетчер печати ничего не знает о именах файлов и даже представления не имеет, как печатать документы. Он умеет выводить на печать только специально подготовленные задания.
А то, что Вы можете узнать имя файла, без пути - так это чистой воды везение. Просто многие программы не утруждают себя, да и пользователю проще, и устанавливают имя задания равным имени файла. Если делать печать самостоятельно, то можно установить там всё что заблагорассудиться (ну не абсолютно всё, но например "тихо, идет печать" можно ).
По этому у Вас есть такая возможность - надо написать свой драйвер принтера. К сожалению модифицировать документ можно будет только в пределах страниц. То есть, наложить "водяной знак" или вывести колонтитул - пожалуйста, но не править текст (но в некоторых случаях всё таки это возможно).
Можно просто написать перехват функций для работы с принтером, но кто гарантирует, что очередная поделка от какого то самоучки не пойдёт в обход?
И что бы окончательно развеять Ваши сомнения, что не драйвер принтера печатает документы, которые "копируются куда то", приведу простой пример. Можно в uses добавить модуль printers. Станет доступным глобальный объект Printer. У него есть канва, на которой можно рисовать, как на обычной форме/Image. Вот только надо давать команды BeginDoc и EndDoc (вроде не ошибся в написании) для начала и конца страницы.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Iskatel (статус: Посетитель), 20 января 2009, 13:26 [#5]:
Как я понимаю, файл, передаваемый спулеру, имеет формат EMF. Где создается этот файл? И самое главное, как там хранится документ? Как набор картинок? Для каждой страницы- своя картинка?
|
|
Вадим К (статус: Академик), 20 января 2009, 13:31 [#6]:
а кто сказал, что это будет EMF. Я об этом не говорил. Вообще то это проблема винды, и Вас она волновать не должна.
Где создаётся? может в памяти... опять это волновать не должно.
Открываейте MSDN и читайте. может и проясниться. Но мне кажеться, что вы у вас не тот ход мыслей, не в ту сторону.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|