2016-04-14 1 views
0

Ich erstelle ein kleines Plug-in für eine Anwendung, die C# verwendet, um die Drucker basierend auf dem zu druckenden Dokument automatisch umzuschalten. Mit C# Ich habe eine Liste von Druckern, die auf dem System installiert sind, muss aber die Spooler-ID/Name und den Verbindungstyp für jeden Drucker bestimmen.Abrufen des Druckerspooler-Namens und Verbindungstyps

Im Wesentlichen ändere ich einen Registrierungsschlüssel, den die Host-Anwendung verwendet, um den Standarddrucker für den nächsten Druck zu verwenden, und der Wert hat das Format Druckername; Spooler, Verbindungstyp, der für verschiedene Drucker eindeutig zu sein scheint. Hier

ist ein Beispiel für den Wert I konstruieren müssen: HP LaserJet 5500,winspool,Ne01:

ich den Druckernamen haben, nur nicht sicher, wie die anderen params für jeden Drucker abzurufen.

Das Codefragment, das ich verwende, um die Liste der Drucker abzurufen, basiert auf System.Drawing;

foreach (string printer in PrinterSettings.InstalledPrinters) 

    Console.WriteLine(printer); 

    var printerSettings = new PrinterSettings(); 
    Console.WriteLine(printerSettings.PrinterName); 
} 
foreach (string printer in PrinterSettings.InstalledPrinters) 

    Console.WriteLine(printer); 

    var printerSettings = new PrinterSettings(); 
    Console.WriteLine(printerSettings.PrinterName); 
} 

Antwort

1

Ich weiß nicht, ob das Ihnen mehr hilft, oder zumindest einen tieferen Weg zu Ihrem Endergebnis. Ich hatte ähnliche Notwendigkeit, in Drucker-Komponente/Treiber-Einstellungen zu suchen und dies zu haben. Obwohl ich einen Schalter/Fall für jeden möglichen Typ für die Drucker habe, die ich auf meiner Maschine habe, kann es andere geben, und Sie können pausieren und in mehr der Einstellungen bohren, die tiefere Verschachtelungselemente sein könnten. Eine solche, die ich brauchte, wurde in der Warteschlange gefunden.DefaultPrintTicket, um die x/y-Seitenauflösung für einen Etikettendrucker zu bestimmen.

using System.Printing; 

     var ps = new PrintServer(); 
     var queues = ps.GetPrintQueues(
      new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 

     // The AMSConfig table has width of 70 for binding to match. 
     StringBuilder sb = new StringBuilder(); 
     foreach (var queue in queues) 
     { 
      sb.AppendLine(queue.Name); 
      if (queue.PropertiesCollection == null) 
       continue; 

      foreach (System.Collections.DictionaryEntry ppd in queue.PropertiesCollection) 
      { 
       switch(ppd.Value.ToString()) 
       { 
        case "System.Printing.IndexedProperties.PrintStringProperty": 
         var psp = ppd.Value as System.Printing.IndexedProperties.PrintStringProperty; 
         sb.AppendLine(ppd.Key + " : " + psp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintInt32Property": 
         var pip = ppd.Value as System.Printing.IndexedProperties.PrintInt32Property; 
         sb.AppendLine(ppd.Key + " : " + pip.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintTicketProperty": 
         var ptp = ppd.Value as System.Printing.IndexedProperties.PrintTicketProperty; 
         sb.AppendLine(ppd.Key + " : " + ptp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintBooleanProperty": 
         var pbp = ppd.Value as System.Printing.IndexedProperties.PrintBooleanProperty; 
         sb.AppendLine(ppd.Key + " : " + pbp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintQueueStatusProperty": 
         var pstap = ppd.Value as System.Printing.IndexedProperties.PrintQueueStatusProperty; 
         sb.AppendLine(ppd.Key + " : " + pstap.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintQueueAttributeProperty": 
         var pap = ppd.Value as System.Printing.IndexedProperties.PrintQueueAttributeProperty; 
         sb.AppendLine(ppd.Key + " : " + pap.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintProcessorProperty": 
         var ppp = ppd.Value as System.Printing.IndexedProperties.PrintProcessorProperty; 
         sb.AppendLine(ppd.Key + " : " + ppp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintPortProperty": 
         var pportp = ppd.Value as System.Printing.IndexedProperties.PrintPortProperty; 
         sb.AppendLine(ppd.Key + " : " + pportp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintServerProperty": 
         var psvrp = ppd.Value as System.Printing.IndexedProperties.PrintServerProperty; 
         sb.AppendLine(ppd.Key + " : " + psvrp.Value); 
         break; 

        case "System.Printing.IndexedProperties.PrintDriverProperty": 
         var pdp = ppd.Value as System.Printing.IndexedProperties.PrintDriverProperty; 
         sb.AppendLine(ppd.Key + " : " + pdp.Value); 
         break; 
       } 
      } 

      sb.AppendLine(""); 
      sb.AppendLine(""); 
     } 

     System.IO.File.WriteAllText("PrinterInfo.txt", sb.ToString()); 

So am Ende dieser, erhalte ich eine Liste der obersten Ebene pro Drucker so etwas wie ...

PaperPort Image Printer 
SeparatorFile : 
Location : 
UntilTimeOfDay : 0 
ShareName : 
Name : PaperPort Image Printer 
Priority : 1 
AveragePagesPerMinute : 0 
UserPrintTicket : 
IsXpsEnabled : False 
DefaultPrintTicket : 
QueueStatus : None 
QueueAttributes : 65 
StartTimeOfDay : 0 
QueuePrintProcessor : System.Printing.PrintProcessor 
QueuePort : System.Printing.PrintPort 
DefaultPriority : 1 
Comment : 
Description : \\[machine]\PaperPort Image Printer,Nuance Image Printer Driver, 
HostingPrintServer : 
QueueDriver : System.Printing.PrintDriver 
NumberOfJobs : 0 

Wieder einige dieser Objekte Werte haben, die andere Objekte sind tiefer zu bohren , wie zum Beispiel einen COM-Port zu bekommen, aber auch das sollte Sie zu einem Haufen mehr Details bringen und hoffentlich finden, was Sie brauchen.

+0

Danke für den Vorschlag @DRapp. Leider konnte ich die gesuchten Parameter nicht finden, konnte jedoch eine funktionierende Lösung bereitstellen. Naiv, nachdem ich die Registrierungswerte beim Ändern des Standarddruckers und die eindeutigen Werte für jeden Drucker untersucht hatte, nahm ich an, dass die letzten zwei Parameter benötigt wurden, um das zu spiegeln, was ich beim Umschalten im Betriebssystem sah. Ich bin mir nicht sicher, warum, aber es stellt sich heraus, dass es funktioniert, wenn ich wie im Beispiel 'Druckername, winspool, Ne01:' verlasse und einfach den Namen des Druckers ändere. Ich wünschte nur, ich hätte es vorher versucht! Danke für die Hilfe – Ashley