2011-02-15 49 views
11

benim uygulamada (Windows Yedi, VS2010) bir görüntüyü başarıyla yazdırdıktan sonra bir kredi sayacı azaltmak zorundayım. Her halükarda, tüm süreci başlatmadan önce, kullanıcıyı kağıt üzerinde, kağıt sıkışması ve benzeri konularda uyarmak için yazıcı durumunu bilmek istiyorum. Şimdi etrafa bakınca Windows WMI kullanan birkaç örnek buldum ama ... asla işe yaramıyor. Örneğin, THIS snippet'i kullanarak, yazıcı durumunu her zaman hazır olur da kağıdı çıkarırsam, kapağı açın ... yazıcıyı kapatın.C# yazıcı durumunu kontrol et

Yazıcı durumu her zaman iyi, şimdi evde rahatça sökülen yazıcıyı ofisinden test ediyorum. , bir yazıcı hatası durumuna sahip olmak için cihazı dinamit ile patlatmalı mıyım?

Bu

'printername' parametresi olarak alındığında nereden
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"); 
     } 

    } 

} 

kullandım koddur.

Tavsiye ettiğiniz için teşekkür ederiz.

+2

Çalışan bir şey bulduğunuzda, * yazdırdığınız bu durumlardan herhangi biri veya tümü ile başa çıkmak zorunda olduğunuzu unutmayın. Ayrıca, durumu denetleme ve yazdırma işini başlatma arasında dinamitin kesilmesi gerekebilir. –

+2

WMI'yi suçlayabilir. Çoğu yazıcı sürücüsü WMI'nın seçmesi için yazıcı durumunu doğru şekilde güncellemez. biz çeşitli zamanlarda karşı karşıyayız –

+0

hangi yazıcı (lar) bakıyorsunuz? –

cevap

9

Kullandığınız .Net'in hangi sürümünü kullandığınızı söyleyemezsiniz, ancak .Net 3.0'dan bu yana iyi bir yazdırma işlevi vardır. Bunu kullandım ve her türlü durum düzeyini bildirdiğinden emin olamadığım halde, çeşitli yazıcılar için 'Toner Az' gibi mesajlar gördüm.

PrinterDescription özel bir sınıf ama özelliklerini kullanarak görebilirsiniz.

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

Konsol uygulamasından bir sayfayı doğrudan yazıcıya yazdıysam (verb = "print" ile işlemi kullanarak ve ona .pdf besleyerek); Baskı kuyruğu başarıyla yazdırılabilir mi? Belge basıldı mı? (Belge için?) – flute

+1

Kullanıyorum. Net 4.5, .Net 4.5 – AmirhosseinYari

0

yazıcı markalarıyla genelinde güvenilir tek çözüm yazdırılan sayfa sayısını sorgulamak ve gönderilen belgede sayfa sayısını maçlar sağlamak için SNMP kullanmaktır.

sayfa sayısı açısından

SNMP OSB benim test itibaren 1.3.6.1.2.1.43.10.2.1.4

olduğunu her stratejisi (defalarca yazdırma kuyruğunu getirirken garip null başvuru istisnalar) güvenilmez davranışı vardı ya sağlamıştır hatalı durum kodları veya sayfa sayısı.

7

PrintQueue sınıfının System.Printing ad alanı içinde bulunduğunuz ad alanıdır. Yazıcının temsil ettiği durumu hakkında yararlı bilgiler veren birçok özelliğe sahiptir. İşte bazı örnekler; Hiçbir kapsamlı bir liste anlamına gelir ve bunları işlemek sıraya düşünmek gerekir böylece kuyruk Bu durumlardan biri veya daha fazla olması mümkün olduğunu unutmayın tarafından

 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; 

Bu

olduğunu.

+0

içinde mevcut değil Aslında, yorumumu geri çekiyorum, bu işe yaramıyor. – Yusha

+0

Sadece varsayılan yazıcıyı okuyorsunuz. Bir sistem üzerinde yüklü birden fazla yazıcıya sahip olabilir ve her birinin kendi kuyruğu ve kendi durumu vardır – AaA

İlgili konular