Come ottenere informazioni sulla stampante in .NET?
-
08-07-2019 - |
Domanda
Nel PrintDialog standard ci sono quattro valori associati a una stampante selezionata: Status, Type, Where e Comment.
Se conosco il nome di una stampante, come posso ottenere questi valori in C # 2.0?
Soluzione
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);
}
}
Altri suggerimenti
Questo dovrebbe funzionare.
using System.Drawing.Printing;
...
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting
Successivamente, i vari le proprietà di PrinterSettings possono essere lette.
Nota che ps.isValid ()
può vedere se la stampante esiste davvero.
Modifica: un commento aggiuntivo. Microsoft consiglia di utilizzare un PrintDocument e modifica le sue Impostazioni stampante anziché creare direttamente le Impostazioni stampante.
Si noti che l'articolo in cui dowski e Panos si riferiva 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. ad esempio, " ExtendedPrinterStatus " il primo valore nella tabella è 1, quindi il tuo array dovrebbe essere qualcosa del genere:
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 il tuo array dovrebbe essere qualcosa del genere:
string[] arrErrorState = {
"Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
"No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
"Output Bin Full"
};
A proposito, & Quot; PrinterState " è obsoleto, ma puoi utilizzare " PrinterStatus " ;.
Solo per riferimento, qui è un elenco di tutte le proprietà disponibili per un ManagementObject della stampante.
usage: printer.Properties["PropName"].Value
È passato molto tempo da quando ho lavorato in un ambiente Windows, ma suggerirei di guardare utilizzando WMI .
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 (utilizzabile da app non WPF).
http://msdn.microsoft .com / it-it / library / System.Printing (v = vs.110) aspx
Un esempio per recuperare lo stato della coda di stampa e del primo lavoro ..
var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus
In alternativa a WMI puoi ottenere risultati rapidi e precisi toccando WinSpool.drv (cioè API di Windows) - puoi ottenere tutti i dettagli su interfacce, strutture e amp; costanti da pinvoke.net, oppure ho messo insieme il codice in http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html