Используя эту статью в качестве примера: 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")
.
Где я ошибаюсь, пытаясь поймать сбойное задание на печать, если приложение не зависло в состоянии ожидания?