WPF应用程序将原始数据发送到打印机异常处理

问题描述

| 以本知识库文章为例: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);
        }
如果打印机可用,一切正常,我得到actual2ѭ以及实际打印的总和。但是,如果关闭打印机电源(在尝试打印之前),则不会出现“打印失败”消息框。相反,该应用程序被冻结并等待直到打开打印机电源,然后成功打印了排队的打印作业,应用程序被冻结,我得到了3英镑。 在应用程序不处于冻结等待状态的情况下,尝试捕获失败的打印作业时,我在哪里出错?     

解决方法

        您应该异步运行WritePrinter方法,然后检查Marshal.GetLastWin32Error();。     ,        这是老派。您可能要使用此
// 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,myByteBuffer.Length);
myStream.Close();
源msdn