开发WPF应用程序,我创建了一个自定义PrintDialog,原因有几个。 在这个PrintDialog中,我有一些用户可以经常修改的选项,以及一个允许用户访问打印机属性并根据需要修改它的按钮。
为此,我们只需调用本机函数:
[DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(
IntPtr hwnd,
IntPtr hPrinter,
[MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
IntPtr pDevModeOutput,
IntPtr pDevModeInput,
int fMode);
/// <summary>
/// Affiche la fenêtre de propriété de l'imprimante de la queue fournie
/// </summary>
/// <param name="printQueue"></param>
private void OpenPrinterDialog(PrintQueue printQueue)
{
PrintTicketConverter ptc = new PrintTicketConverter(printQueue.FullName, printQueue.ClientPrintSchemaVersion);
IntPtr mainWindowPtr = new WindowInteropHelper(this).Handle;
byte[] myDevMode = ptc.ConvertPrintTicketToDevMode(printQueue.UserPrintTicket, BaseDevModeType.UserDefault);
GCHandle pinnedDevMode = GCHandle.Alloc(myDevMode, GCHandleType.Pinned);
IntPtr pDevMode = pinnedDevMode.AddrOfPinnedObject();
int res = DocumentProperties(mainWindowPtr, IntPtr.Zero, printQueue.FullName, pDevMode, pDevMode, 14);
if (res == 1)
printQueue.UserPrintTicket = ptc.ConvertDevModeToPrintTicket(myDevMode);
pinnedDevMode.Free();
}
在开发计算机中,它工作正常。但在测试计算机上,打印类型会随之改变。 Picture。
在测试计算机时,它有时会进行正常打印,有时用于保护打印,有时用于其他方面,没有任何理由。在同一台计算机上,打开窗口,取消并再次打开可以显示2个不同的结果。
我们现在看到的唯一区别是,在开发时我们安装了.Net 4.5,在测试时它们只有4.0。我们计划在其中一台机器上安装4.5以查看这是否“解决”了这个问题,但它不能成为我们的解决方案。
那么,有没有人看到这个的原因,或者可能知道一种方法来指明我们想要“正常打印”?
你的时间。
答案 0 :(得分:0)
为什么不使用任何dll导入和dafault gui配置打印机的“正常”方式?
我使用我在programmcode中生成的FlowDocument然后使用flowdocument查看器来显示文档并设置默认的打印机设置。
打印代码:
_document是一个带有我的打印内容的FlowDocument。
System.Windows.Controls.PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
printDlg.PageRangeSelection = PageRangeSelection.AllPages;
printDlg.UserPageRangeEnabled = true;
printDlg.PrintTicket.PageOrientation = _ticket.PageOrientation;
printDlg.PrintTicket.PagesPerSheet = _ticket.PagesPerSheet;
Nullable<Boolean> print = printDlg.ShowDialog();
if (print == true)
{
_document.PageWidth = printDlg.PrintableAreaWidth;
_document.ColumnWidth = _document.PageWidth;
... do some format stuff
IDocumentPaginatorSource idocument = _document as IDocumentPaginatorSource;
printDlg.PrintDocument(idocument.DocumentPaginator, _document.Name);
}