如何指定打印类型?

时间:2014-04-25 11:58:34

标签: c#

开发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以查看这是否“解决”了这个问题,但它不能成为我们的解决方案。

那么,有没有人看到这个的原因,或者可能知道一种方法来指明我们想要“正常打印”?

你的时间。

1 个答案:

答案 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);




            }