web-dev-qa-db-fra.com

Comment obtenir des informations sur l'imprimante dans .NET?

Dans le PrintDialog standard, quatre valeurs sont associées à une imprimante sélectionnée: État, Type, Où et Commentaire.

Si je connais le nom d'une imprimante, comment puis-je obtenir ces valeurs en C # 2.0?

46
Nick Gotch

Comme suggéré par dowski , vous pouvez utiliser WMI pour obtenir les propriétés de l'imprimante. Le code suivant affiche toutes les propriétés d'un nom d'imprimante donné. Parmi eux, vous trouverez: PrinterStatus, Comment, Location, DriverName, PortName, etc.

using System.Management;

...

string printerName = "YourPrinterName";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
using (ManagementObjectCollection coll = searcher.Get())
{
    try
    {
        foreach (ManagementObject printer in coll)
        {
            foreach (PropertyData property in printer.Properties)
            {
                Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
            }
        }
    }
    catch (ManagementException ex)
    {
        Console.WriteLine(ex.Message);
    }
}
71
Panos

Cela devrait fonctionner.

using System.Drawing.Printing;

...

PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting

Après cela, les divers propriétés de PrinterSettings peuvent être lus.

Notez que ps.isValid() peut voir si l'imprimante existe réellement.

Edit: Un commentaire supplémentaire. Microsoft vous recommande d'utiliser un PrintDocument et de modifier ses PrinterSettings plutôt que de créer un PrinterSettings directement.

23
Powerlord
6
John Sheehan

Veuillez noter que l'article qui dowski et Panos renvoyait à ( MSDN Win32_Printer ) peut être un peu trompeur.

Je fais référence à la première valeur de la plupart des tableaux. certains commencent par 1 et certains commencent par 0. par exemple, " ExtendedPrinterStatus" la première valeur du tableau est 1, par conséquent, votre tableau doit ressembler à ceci:

string[] arrExtendedPrinterStatus = { 
    "","Other", "Unknown", "Idle", "Printing", "Warming Up",
    "Stopped Printing", "Offline", "Paused", "Error", "Busy",
    "Not Available", "Waiting", "Processing", "Initialization",
    "Power Save", "Pending Deletion", "I/O Active", "Manual Feed"
};

et d'autre part, " ErrorState" la première valeur dans la table est 0, par conséquent, votre tableau devrait ressembler à ceci:

string[] arrErrorState = {
    "Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
    "No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
    "Output Bin Full"
};

BTW, " PrinterState" est obsolète, mais vous pouvez utiliser " PrinterStatus".

3
itsho

Juste pour référence, ici est une liste de toutes les propriétés disponibles pour un ManagementObject d'imprimante.

usage: printer.Properties["PropName"].Value
3
David

Cela fait longtemps que je n'ai pas travaillé dans un environnement Windows, mais je vous suggère de regarder en utilisant WMI .

2
dowski

Je sais que c'est une ancienne publication, mais de nos jours, l'option plus facile/plus rapide consiste à utiliser les services d'impression améliorés offerts par le cadre WPF (utilisables par les applications non-WPF).

http://msdn.Microsoft.com/en-us/library/System.Printing (v = vs.110) .aspx

Un exemple pour récupérer l'état de la file d'attente de l'imprimante et du premier travail.

var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus
2
stoj

Comme alternative à WMI, vous pouvez obtenir des résultats rapides et précis en appuyant sur WinSpool.drv (c'est-à-dire l'API Windows) - vous pouvez obtenir tous les détails sur les interfaces, les structures et les constantes de pinvoke.net, ou j'ai assemblé le code sur http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

0
MarkMiddlemist