#c #internet-explorer #printing #webbrowser-control #iwebbrowser2
#c #internet-explorer #печать #webbrowser-control #iwebbrowser2
Вопрос:
Есть ли способ передать структуру PrintDlg (или что-то подобное) моему элементу управления WebBrowser (Internet Explorer / IWebBrowser2) таким образом, чтобы он печатал на принтере, указанном в PrintDlg, без появления диалогового окна печати? Я хочу сделать это без изменения принтера по умолчанию. IWebBrowser2::ExecWB предоставляет способ пропустить всплывающее диалоговое окно (OLECMDEXECOPT_DONTPROMPTUSER), но не способ указать принтер.
При простой смене принтера по умолчанию возникают две проблемы: 1) он медленный, 2) Internet Explorer сохраняет свой текущий принтер в кэше. При печати на принтере по умолчанию этот принтер будет кэшироваться. Если вы затем измените принтер по умолчанию и прикажете ему печатать снова, IE не будет использовать новый принтер по умолчанию, он будет использовать свой кэшированный текущий принтер.
После IE 5.5 текущий принтер не сохраняется в реестре Windows.
В качестве альтернативы я исследовал 4 разные идеи для получения изображения из элемента управления IE и самостоятельной печати вместо того, чтобы заставлять элемент управления печатать сам:
-
Использование IViewObject::Draw. Я могу получить изображение, но не могу масштабировать его на бумаге так же, как при печати для IE:
RECTL rect;
rect.слева = 0;
rect.top = 0;
rect.right = GetDeviceCaps(высота принтера, ФИЗИЧЕСКАЯ ШИРИНА);
rect.bottom = GetDeviceCaps(высота принтера, ФИЗИЧЕСКАЯ ВЫСОТА);StartDoc(printerhdc, amp;di);
StartPage(printerhdc);
HRESULT hr = pViewObj->Draw(DVASPECT_DOCPRINT, page, NULL, pTargetDevice, printerhdc, printerhdc, amp;rect, NULL, NULL, 0); //печатает слишком маленькую
конечную страницу (printerhdc);
EndDoc(printerhdc); -
Отправка WM_PAINT элементу управления IE. Я мало что сделал с этим, так как прочитал в онлайн-ветке, что это сработало не так хорошо.
-
AxDHTMLEDLib. Очень мало документации, и я думаю, что это только для .net
-
Используя IHTMLElement, IHTMLElementRender->SetDocumentPrinter, IHTMLElementRender->DrawToDC. Microsoft прекратила поддержку IE9
Любые идеи, которые у вас могут возникнуть, были бы высоко оценены! Заранее спасибо!
Ответ №1:
Если у вас есть некоторая гибкость в использовании принтера по умолчанию, вот еще одна идея. Хотя это немного запутанно.
-
установите на свой принтер по умолчанию какой-нибудь PDF writer (например, Amyuni PDF или Adobe Distiller). Эти драйверы принтера преобразуют входящее задание в файл PDF, и вы можете настроить его для сохранения файла в каком-либо месте на диске.
-
используйте PowerShell, чтобы распечатать этот PDF-файл на нужном вам целевом принтере. Вы можете либо использовать интерфейс библиотеки DLL PrintUI, либо использовать и команду «print». http://www.eggheadcafe.com/software/aspnet/30441939/how-to-suppress-printdialog-when-using-print-verb.aspx приведен пример. Делая это, вы можете выполнить все настройки очереди принтера в этом скрипте и оставить принтер по умолчанию как есть
Комментарии:
1. Спасибо за вашу идею! Я этого не учел. Это было бы сложно, поскольку у наших пользователей не обязательно будет установлен драйвер PDF.
2. Это также приведет к снижению производительности, но я рассмотрю это, если не будет представлено другого прямого метода.