2011-06-12 3 views
0

이 KB 기사를 예제로 사용하십시오. http://support.microsoft.com/kb/322091/en-us,
원시 데이터 (바이트 배열)를 감열 식 프린터로 보내려고합니다. 이를 위해 나는 위의 문서에서 다음 방법을 사용하십시오 프린터를 사용할 수WPF 응용 프로그램에서 원시 데이터를 프린터로 보내는 중 예외 처리

 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");를 얻을 :

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; 
    } 

그래서 나는 배열을 보낼 수 있습니다. 그러나 인쇄를 시도하기 전에 프린터를 끄면 인쇄가 실패했습니다. MessageBox. 대신 응용 프로그램이 고정되어 프린터가 켜질 때까지 기다렸다가 대기중인 인쇄 작업이 성공적으로 인쇄되면 응용 프로그램이 고정 해제되고 MessageBox.Show("Text printed")이됩니다.

응용 프로그램이 정지 상태가 아닌 상태에서 실패한 인쇄 작업을 잡으려는 시도가 잘못되었습니다.

답변

1

WritePrinter Method를 비동기 적으로 실행하고 Marshal.GetLastWin32Error()를 확인하십시오.

+0

을 사용할 수 있습니다. 작업이 완료되면 Marshal.GetLastWin32Error()가 RunWorkerCompleted 이벤트에서 검사됩니다. 이 경우 항상 0입니다. (그리고'RunWorkerCompleted' 이벤트는 실제 인쇄가 끝난 경우에만 발생하므로 불행히도 도움이되지 않습니다. 감사합니다. 모두 동일합니다 . – rem

+0

GetLastWin32Error가 작동하지 않는 경우가 있습니다. 인쇄 시간이 1 분을 넘는 것처럼 여기에서 속일 수 있습니다. 그러면 문제가 생깁니다. –

+0

OK, Navid. +1 – rem

0

이것은 오래된 학교입니다. 당신은 프린터가 꺼져있는 동안 앱을 동결되지 제외하고는 모두가 동일합니다이 경우이

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

관련 문제