Как установить свойство __IE_PrinterCmd_DevMode для структуры DEVMODE в шаблоне печати в IE с Visual C ++ - PullRequest
3 голосов
/ 05 января 2012

Шаблон печати в IE использует это свойство для определения информации о выбранном принтере после того, как пользователь закрывает диалоговое окно «Печать».Как я могу установить это свойство в структуру DEVMODE с кодом в Visual C ++. Как мне преобразовать структуру DEVMODE в вариант .Если это возможно, я могу передать вариант для печати шаблона и затем установить свойство __IE_PrinterCmd_DevMode в jscript.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2013

Марк Дурдин имеет отличный пост в блоге с подробным примером на Delphi. Он легко переносим на C ++ и другие языки:

Демистификация печати с помощью элемента управления Microsoft WebBrowser и ShowHTMLDialogEx

В частности, __IE_PrinterCmd_DevMode должен быть разблокирован HGLOBAL (как правило, допустимое возвращаемое значение из GlobalAlloc или GlobalReAlloc). Это нигде не задокументировано, я полагаю, что Марк обнаружил трудный путь методом проб и ошибок, и, наконец, обнаружил, что он работает со значениями в полях PRINTDLG.hDevMode и PRINTDLG.hDevNames, как это прямо предусмотрено вызовом PrintDlg.

Мне удалось передать HGLOBAL s как целые числа в скрипт шаблона и использовать их для инициализации __IE_PrinterCmd_DevMode и __IE_PrinterCmd_DevNames перед созданием TemplatePrinter. Это удобно, если вы не хотите звонить ShowHTMLDialogEx самостоятельно и у вас уже есть зацепка в вашем приложении. Я использую объект сценария external в исходном окне. Для доступа к нему из шаблона я использую:

dialogArguments.__IE_BrowseDocument.parentWindow.external

PS: Передача HGLOBAL как целого числа работает в 32-разрядном процессе, поскольку числа JScript на самом деле являются двойными числами, которые могут представлять последовательные целые числа вплоть до 53-разрядных. Но из-за этого ограничения передача HGLOBAL как целого числа в 64-битном процессе не является надежной.

Возможно, вы можете сделать так, чтобы у вашего window.external объекта был метод, который ожидает объект dialogArguments шаблона печати, который устанавливает __IE_PrinterCmd_DevMode и __IE_PrinterCmd_DevNames с целым числом VARIANT s (VT_I8 или VT_UI8 ).

Я еще не проверял это.

Если вы просто хотите выбрать принтер, отличный от системного по умолчанию, вы также можете установить свойство __IE_PrinterCMD_Printer. Вы можете сделать это в JScript, это повлияет на объекты поведения TemplatePrinter, которые вы создадите после его установки. Однако, используя только это свойство, вы не можете управлять начальными настройками или знать, какой принтер окончательно выбрал пользователь.

1 голос
/ 27 февраля 2017

Я только что столкнулся с такой же проблемой и обнаружил, что __IE_PrinterCmd_DevMode и __IE_PrinterCmd_DevNames можно установить из IntPtr.

Это в приложении X86, поэтому не уверен, что произойдет на x64 или AnyCPU.

Как и предполагалось, я использую класс для передачи DevMode и DevNames через внешний объект.

Вот основные части кода, для этого:

Public Class PrintObjCls
 Public Printer As String
 Public DevMode As IntPtr
 Public DevNames As IntPtr
 Public Printing As Boolean
 Public Failed As Boolean 
 Public Progress As Integer
End Class

Sub PrintToTemplate(Web as WebBrowser, Settings as PrinterSettings)
 Dim Obj As New PrintObjCls
 Obj.Printer = Settings.PrinterName
 Obj.DevMode = Settings.GetHdevmode
 Obj.DevNames = Settings.GetHdevnames
 Web.ObjectForScripting = Obj
End Sub

Тогдав шаблоне печати

var ext = doc.parentWindow.external;
dialogArguments.__IE_PrinterCMD_Printer = ext.Printer;
dialogArguments.__IE_PrinterCmd_DevMode = ext.DevMode;
dialogArguments.__IE_PrinterCmd_DevNames = ext.DevNames;
...