So erhalten Sie die Liste aller Drucker im Computer

99

Ich muss die Liste aller Drucker abrufen, die eine Verbindung zum Computer herstellen.

Wie mache ich das in C #, WinForms?

Gold
quelle

Antworten:

197

Versuche dies:

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    MessageBox.Show(printer);
}
Jojo Sardez
quelle
9
Ich habe nie daran gedacht, in System.Drawing danach zu suchen!
Olivier Jacot-Descombes
57

Wenn Sie mehr Informationen als nur den Namen des Druckers benötigen, können Sie diese über die System.ManagementAPI abfragen:

var printerQuery = new ManagementObjectSearcher("SELECT * from Win32_Printer");
foreach (var printer in printerQuery.Get())
{
    var name = printer.GetPropertyValue("Name");
    var status = printer.GetPropertyValue("Status");
    var isDefault = printer.GetPropertyValue("Default");
    var isNetworkPrinter = printer.GetPropertyValue("Network");

    Console.WriteLine("{0} (Status: {1}, Default: {2}, Network: {3}", 
                name, status, isDefault, isNetworkPrinter);
}
Christian Moser
quelle
8

Abrufen der Netzwerk- und lokalen Druckerliste in ASP.NET

Diese Methode verwendet die Windows-Verwaltungsinstrumentierung oder die WMI-Schnittstelle. Diese Technologie dient zum Abrufen von Informationen zu verschiedenen Systemen (Hardware), die unter einem Windows-Betriebssystem ausgeführt werden.

private void GetAllPrinterList()
        {
            ManagementScope objScope = new ManagementScope(ManagementPath.DefaultPath); //For the local Access
            objScope.Connect();

            SelectQuery selectQuery = new SelectQuery();
            selectQuery.QueryString = "Select * from win32_Printer";
            ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
            ManagementObjectCollection MOC = MOS.Get();
            foreach (ManagementObject mo in MOC)
            {
                lstPrinterList.Items.Add(mo["Name"].ToString());
            }
        }

Klicken Sie hier, um die Quell- und Anwendungsdemo herunterzuladen

Demo der Anwendung, in der das Netzwerk und der lokale Drucker aufgelistet sind

Geben Sie hier die Bildbeschreibung ein

Code Scratcher
quelle
Ist Ihre Demo auch in ASP.NET?
AaA
5

Sie können auch die LocalPrintServer-Klasse verwenden. Siehe: System.Printing.LocalPrintServer

    public List<string>  InstalledPrinters
    {
        get
        {
            return (from PrintQueue printer in new LocalPrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local,
                EnumeratedPrintQueueTypes.Connections }).ToList()
                    select printer.Name).ToList(); 
        } 
    }

Wie in den Dokumenten angegeben: Klassen im System.Printing-Namespace werden für die Verwendung in einem Windows-Dienst oder einer ASP.NET-Anwendung oder einem ASP.NET-Dienst nicht unterstützt.

Hernan Alonso
quelle
Können Sie eine Erklärung zum Code hinzufügen?
Jhpratt
Dies ist eine sehr interessante Antwort. Wenn Sie nur die Namen benötigen, ist die akzeptierte Antwort korrekt. Wenn Sie andere Daten benötigen, ist die Verwendung der Abfrage für win32_Printer viel langsamer als bei diesem Aufruf
Noman_1
0

Wenn Sie mit MVC C # arbeiten, können Sie auf diese Weise mit Druckern und seriellen Anschlüssen für Dropdowns umgehen.

using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;
using System.Drawing.Printing;

    public class Miclass
    {
        private void AllViews()
        {
            List<PortClass> ports = new List<PortClass>();
            List<Printersclass> Printersfor = new List<Printersclass>();
            string[] portnames = SerialPort.GetPortNames();
            /*PORTS*/
            for (int i = 0; i < portnames.Count(); i++)
            {
                ports.Add(new PortClass() { Name = portnames[i].Trim(), Desc = portnames[i].Trim() });
            }
            /*PRINTER*/
            for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
            {
                Printersfor.Add(new Printersclass() { Name = PrinterSettings.InstalledPrinters[i].Trim(), Desc = PrinterSettings.InstalledPrinters[i].Trim() });
            }
        }
    }
    public class PortClass
    {
        public string Name { get; set; }
        public string Desc { get; set; }

        public override string ToString()
        {
            return string.Format("{0} ({1})", Name, Desc);
        }
    }
    public class Printersclass
    {
        public string Name { get; set; }
        public string Desc { get; set; }

        public override string ToString()
        {
            return string.Format("{0} ({1})", Name, Desc);
        }
    }
RUBEN
quelle