2011-02-15 45 views
11

내 응용 프로그램 (Windows Seven, VS2010) 이미지를 성공적으로 인쇄 한 후 신용 카운터를 줄여야합니다. 어쨌든 전체 프로세스를 시작하기 전에 사용자에게 용지가 없음, 용지 걸림 등을 경고하기 위해 프린터 상태를 알고 싶습니다. 이제 주위를 둘러 보았지만 Windows WMI를 사용하는 여러 예제를 발견했지만 ... 결코 작동하지 않습니다. 예를 들어, THIS 스 니펫을 사용하여 용지를 제거하고 표지를 열었을 때 프린터 상태가 항상 준비됩니다. 프린터를 끕니다.C# 프린터 상태 확인

프린터 상태는 현재 양호합니다. 사무실에서 편안하게 꺼져있는 프린터를 테스트하고 있습니다. 프린터 오류 상태를 갖기 위해 다이너마이트로 장치를 폭파 할 수 있습니까?

은 'printerName를'을 매개 변수로 수신 어디
ManagementObjectCollection MgmtCollection; 
ManagementObjectSearcher MgmtSearcher; 

//Perform the search for printers and return the listing as a collection 
MgmtSearcher = new ManagementObjectSearcher("Select * from Win32_Printer"); 
MgmtCollection = MgmtSearcher.Get(); 

foreach (ManagementObject objWMI in MgmtCollection) 
{ 

    string name = objWMI["Name"].ToString().ToLower(); 

    if (name.Equals(printerName.ToLower())) 
    { 

     int state = Int32.Parse(objWMI["ExtendedPrinterStatus"].ToString()); 
     if ((state == 1) || //Other 
     (state == 2) || //Unknown 
     (state == 7) || //Offline 
     (state == 9) || //error 
     (state == 11) //Not Available 
     ) 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

     state = Int32.Parse(objWMI["DetectedErrorState"].ToString()); 
     if (state != 2) //No error 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

    } 

} 

를 사용했던 코드입니다.

감사합니다.

+2

작동하는 것을 찾았을 때 인쇄 할 때 * 발생하는 이러한 상황 중 일부 또는 전부에 대처해야한다는 것을 기억하십시오. 다이나마이트가 상태를 확인하고 실제로 인쇄 작업을 시작하는 사이에 꺼질 수 있습니다. –

+2

은 WMI를 비난 할 수 있습니다. 대부분의 프린터 드라이버는 WMI가 선택할 프린터 상태를 제대로 업데이트하지 않습니다. 우리는 여러 번 그것에 직면했습니다 –

+0

당신은 어떤 프린터를보고 있습니까? –

답변

9

.Net의 버전은 사용하지 않고 있지만 .Net 3.0 이후에는 좋은 인쇄 기능이 있습니다. 나는 이것을 사용했고 모든 종류의 상태를보고 할 수는 없지만 다양한 프린터에서 'Toner Low'와 같은 메시지를 보았습니다.

PrinterDescription은 맞춤 클래스이지만 당신은 그것의 속성들을 볼 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.printing.aspx

 PrintQueueCollection printQueues = null; 
     List<PrinterDescription> printerDescriptions = null; 

     // Get a list of available printers. 
     this.printServer = new PrintServer(); 
     printQueues = this.printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 
     printerDescriptions = new List<PrinterDescription>(); 

     foreach (PrintQueue printQueue in printQueues) 
     { 
      // The OneNote printer driver causes crashes in 64bit OSes so for now just don't include it. 
      // Also redirected printer drivers cause crashes for some printers. Another WPF issue that cannot be worked around. 
      if (printQueue.Name.ToUpperInvariant().Contains("ONENOTE") || printQueue.Name.ToUpperInvariant().Contains("REDIRECTED")) 
      { 
       continue; 
      } 

      string status = printQueue.QueueStatus.ToString(); 

      try 
      { 
       PrinterDescription printerDescription = new PrinterDescription() 
       { 
        Name = printQueue.Name, 
        FullName = printQueue.FullName, 
        Status = status == Strings.Printing_PrinterStatus_NoneTxt ? Strings.Printing_PrinterStatus_ReadyTxt : status, 
        ClientPrintSchemaVersion = printQueue.ClientPrintSchemaVersion, 
        DefaultPrintTicket = printQueue.DefaultPrintTicket, 
        PrintCapabilities = printQueue.GetPrintCapabilities(), 
        PrintQueue = printQueue 
       }; 

       printerDescriptions.Add(printerDescription); 
      } 
      catch (PrintQueueException ex) 
      { 
       // ... Logging removed 
      } 
     } 
+1

콘솔 응용 프로그램에서 프린터로 직접 페이지를 인쇄하는 경우 (verb = "print"와 함께 프로세스를 사용하고 .pdf를 제공함); 문서가 성공적으로 인쇄 된 것처럼 인쇄 대기열을 추적 할 수 있습니까? (특정 문서의 경우) – flute

+1

.NET 4.5를 사용할 수없는 .Net 4.5를 사용합니다. – AmirhosseinYari

0

프린터의 모든 브랜드에 걸쳐 신뢰성이 유일한 해결책은 인쇄 된 페이지 수를 조회하고 보낸 문서의 페이지 번호와 일치하는지 확인하기 위해 SNMP를 사용하는 것입니다.

페이지 수에 대한

SNMP OID 내 테스트에서 1.3.6.1.2.1.43.10.2.1.4

이며, 다른 모든 전략 (반복 인쇄 대기열을 가져올 때 홀수 null 참조 예외) 신뢰할 수없는 행동을했다거나 제공하고 있습니다 부정확 한 상태 코드 또는 페이지 수.

7

네임 스페이스의 PrintQueue 클래스는 현재 사용중인 것입니다. 프린터가 나타내는 프린터 상태에 대한 유용한 정보를 제공하는 많은 특성이 있습니다. 여기 몇 가지 예가 있어요; 더 포괄적 인 목록을 의미하고 당신이 그들을 처리하는 순서에 대해 생각해야합니다 그래서 큐가이 상태 중 하나 이상을 갖는 것이 가능하다는 것을 기억하여

 var server = new LocalPrintServer(); 

     PrintQueue queue = server.DefaultPrintQueue; 

     //various properties of printQueue 
     var isOffLine = queue.IsOffline; 
     var isPaperJam = queue.IsPaperJammed; 
     var requiresUser = queue.NeedUserIntervention; 
     var hasPaperProblem = queue.HasPaperProblem; 
     var isBusy = queue.IsBusy; 

는 없다.

+0

사실 내 의견을 철회합니다. 작동하지 않습니다. – Yusha

+0

기본 프린터 만 읽는 중입니다. 시스템에는 여러 개의 프린터가 설치 될 수 있으며 각 프린터에는 자체의 대기열과 자체 상태가 있습니다. – AaA