Domanda Come ottenere informazioni sulla stampante in .NET?


Nel PrintDialog standard ci sono quattro valori associati a una stampante selezionata: Stato, Tipo, Dove e Commento.

Se conosco il nome di una stampante, come posso ottenere questi valori in C # 2.0?


44
2017-11-17 17:05


origine


risposte:


Come suggerito Dowski, è possibile utilizzare WMI per ottenere le proprietà della stampante. Il codice seguente mostra tutte le proprietà per un determinato nome di stampante. Tra questi troverai: PrinterStatus, Comment, Location, DriverName, PortName, ecc.

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

62
2017-11-17 18:11



Questo dovrebbero lavoro.

using System.Drawing.Printing;

...

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

Dopo ciò, i vari proprietà di PrinterSettings può essere letto.

Nota che ps.isValid() può vedere se la stampante esiste realmente.

Modifica: un commento aggiuntivo. Microsoft consiglia di utilizzare a PrintDocument e modificare i suoi Printer Setings piuttosto che creare direttamente un PrinterSettings.


22
2017-11-17 17:42



Guarda a PrinterSettings.InstalledPrinters


6
2017-11-17 17:32



Si prega di notare che l'articolo che Dowski e Panos stava andando a (MSDN Win32_Printer) può essere un po 'fuorviante.

Mi riferisco al primo valore della maggior parte degli array. alcuni iniziano con 1 e alcuni iniziano con 0. per esempio, "ExtendedPrinterStatus"il primo valore nella tabella è 1, quindi l'array dovrebbe essere qualcosa del tipo:

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

e d'altra parte, "ErrorState"il primo valore nella tabella è 0, quindi l'array dovrebbe essere qualcosa del tipo:

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"è obsoleto, ma puoi usare"PrinterStatus".


3
2017-08-14 19:51



È passato molto tempo da quando ho lavorato in un ambiente Windows, ma ti suggerisco di dare un'occhiata usando WMI.


2
2017-11-17 17:23



Solo per riferimento, Qui è un elenco di tutte le proprietà disponibili per un oggetto ManagementObject della stampante.

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

2
2018-01-13 21:32



So che è un vecchio post, ma al giorno d'oggi l'opzione più semplice / veloce è quella di utilizzare i servizi di stampa avanzati offerti dal framework WPF (utilizzabili da app non WPF).

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

Un esempio per recuperare lo stato della coda della stampante e il primo lavoro ..

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

2
2017-11-04 15:04



In alternativa a WMI puoi ottenere risultati rapidi e accurati toccando WinSpool.drv (cioè API Windows) - puoi ottenere tutti i dettagli sulle interfacce, le strutture e le costanti da pinvoke.net, o ho messo insieme il codice a http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html


0
2018-02-27 12:43