【问题标题】:WPF app sending raw data to a printer exception-handlingWPF 应用程序将原始数据发送到打印机异常处理
【发布时间】:2013-06-01 08:50:42
【问题描述】:

以这篇知识库文章为例:http://support.microsoft.com/kb/322091/en-us,
我正在尝试将原始数据(字节数组)发送到热敏打印机。为此,我使用上述文章中的以下方法:

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
        Int32 dwError = 0, dwWritten = 0;
        IntPtr hPrinter = new IntPtr(0);
        DOCINFOA di = new DOCINFOA();
        bool bSuccess = false; // Assume failure unless you specifically succeed.

        di.pDocName = "My C#.NET RAW Document";
        di.pDataType = "RAW";

        // Open the printer.
        if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
        {
            // Start a document.
            if (StartDocPrinter(hPrinter, 1, di))
            {
                // Start a page.
                if (StartPagePrinter(hPrinter))
                {
                    // Write your bytes.
                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                    EndPagePrinter(hPrinter);
                }
                EndDocPrinter(hPrinter);
            }
            ClosePrinter(hPrinter);
        }
        // If you did not succeed, GetLastError may give more information
        // about why not.
        if (bSuccess == false)
        {
            dwError = Marshal.GetLastWin32Error();
        }
        return bSuccess;
    }

所以我发送一个数组:

        bool bSuccess = false;
        ...
        try
        {
            bSuccess = RawPrinterHelper.SendBytesToPrinter(printerName, pUnmanagedBytes, nLength);
        }
        catch (Exception ex)
        {
            failprint = ex.Message;
        }
        if (bSuccess == true)
        {
            MessageBox.Show("Text printed");
        }
        else
        {
            MessageBox.Show("Printing failed: " + failprint);
        }

如果打印机可用,一切正常,我会得到MessageBox.Show("Text printed"); 以及实际打印。但如果我关闭打印机(在尝试打印之前),我不会收到 Printing failed MessageBox。相反,应用程序被冻结并等待打印机打开,然后排队的打印作业成功打印,应用程序解冻,我得到MessageBox.Show("Text printed")

如果应用程序没有进入冻结等待状态,我在尝试捕获失败的打印作业时哪里错了?

【问题讨论】:

    标签: c# wpf printing exception-handling


    【解决方案1】:

    你应该异步运行WritePrinter方法然后检查Marshal.GetLastWin32Error();

    【讨论】:

    • 在这种情况下,一切都一样,除了在打印机关闭时应用程序没有冻结。 Marshal.GetLastWin32Error() 在作业完成后检查RunWorkerCompleted 事件。在这种情况下,它始终等于零。 (只有在实际打印完成时才会引发 RunWorkerCompleted 事件。所以,不幸的是,它没有帮助。谢谢,都一样。
    • GetLastWin32Error 有时不起作用你可以在这里欺骗,如果打印时间超过 1 分钟,那么它就有问题
    【解决方案2】:

    这是老派。你可能想用这个

    // Create the printer server and print queue objects
    LocalPrintServer localPrintServer = new LocalPrintServer();
    PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
    
    // Call AddJob
    PrintSystemJobInfo myPrintJob = defaultPrintQueue.AddJob();
    
    // Write a Byte buffer to the JobStream and close the stream
    Stream myStream = myPrintJob.JobStream;
    Byte[] myByteBuffer = UnicodeEncoding.Unicode.GetBytes("This is a test string for the print job stream.");
    myStream.Write(myByteBuffer, 0, myByteBuffer.Length);
    myStream.Close();
    

    来源 msdn

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多