Приложение WPF, отправляющее необработанные данные на обработку исключений принтера - PullRequest
0 голосов
/ 12 июня 2011

Используя эту статью в качестве примера: 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"); вместе с фактической печатью. Но если я выключаю принтер (до попытки печати), я не получаю Ошибка печати MessageBox. Вместо этого приложение зависает и ждет, пока принтер не включится, затем задание печати в очереди успешно распечатывается, приложение размораживается, и я получаю MessageBox.Show("Text printed").

Где я ошибаюсь, пытаясь поймать сбойное задание на печать, если приложение не зависло в состоянии ожидания?

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Вы должны запустить метод WritePrinter асинхронно, а затем проверить Marshal.GetLastWin32Error ();

0 голосов
/ 01 июня 2013

Это старая школа. Возможно, вы захотите использовать это

// 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...