Hoe krijg ik printerinformatie in .NET?

In de standaard PrintDialog zijn er vier waarden die aan een geselecteerde printer zijn gekoppeld: Status, Type, Where en Comment.

Als ik de naam van een printer weet, hoe kan ik deze waarden dan in C# 2.0 krijgen?


Antwoord 1, autoriteit 100%

Zoals dowski suggereerde, zou je WMI kunnen gebruiken om printereigenschappen ophalen. De volgende code toont alle eigenschappen voor een bepaalde printernaam. Onder hen vindt u: PrinterStatus, Opmerking, Locatie, DriverName, PortName, enz.

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

Antwoord 2, autoriteit 32%

Dit zoumoeten werken.

using System.Drawing.Printing;

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

Daarna zijn de verschillende eigenschappenvan PrinterSettings kunnen worden gelezen.

Merk op dat ps.isValid()kan zien of de printer daadwerkelijk bestaat.

Bewerken: nog een opmerking. Microsoft raadt u aan een PrintDocumenten wijzig de PrinterSettings in plaats van rechtstreeks een PrinterSettings aan te maken.


Antwoord 3, autoriteit 9%

Bekijk PrinterSettings.InstalledPrinters


Antwoord 4, autoriteit 5%

Ter referentie, hieris een lijst van alle beschikbare eigenschappen voor een printer ManagementObject.

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

Antwoord 5, autoriteit 4%

Het is lang geleden dat ik in een Windows-omgeving heb gewerkt, maar ik raad je aan om te kijken op met behulp van WMI.


Antwoord 6, autoriteit 4%

Houd er rekening mee dat het artikel waarnaar dowskien Panosverwezen (MSDN Win32_Printer) kan een beetje misleidend zijn.

Ik verwijs naar de eerste waarde van de meeste arrays. sommige beginnen met 1 en sommige beginnen met 0.
bijvoorbeeld, “ExtendedPrinterStatus” eerste waarde in tabel is 1, daarom zou uw array er ongeveer zo uit moeten zien:

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

en aan de andere kant, “ErrorState” eerste waarde in tabel is 0, daarom zou je array er ongeveer zo uit moeten zien:

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” is verouderd, maar u kunt “PrinterStatus” gebruiken.


Antwoord 7, autoriteit 3%

Ik weet dat het een oud bericht is, maar tegenwoordig is de gemakkelijkere/snellere optie om de verbeterde afdrukservices te gebruiken die worden aangeboden door het WPF-framework (bruikbaar door niet-WPF-apps).

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

Een voorbeeld om de status van de printerwachtrij en de eerste taak op te halen..

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

Antwoord 8

Als alternatief voor WMI kunt u snel nauwkeurige resultaten krijgen door op WinSpool.drv (d.w.z. Windows API) te tikken – u kunt alle details over de interfaces, structs & constanten van pinvoke.net, of ik heb de code samengesteld op http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

Other episodes