Cómo obtener la lista de todas las impresoras en la computadora

99

¿Necesito obtener la lista de todas las impresoras que se conectan a la computadora?

¿Cómo puedo hacerlo en C #, WinForms?

Oro
fuente

Respuestas:

197

Prueba esto:

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    MessageBox.Show(printer);
}
Jojo Sardez
fuente
9
¡Nunca pensé en buscar esto en System.Drawing!
Olivier Jacot-Descombes
57

Si necesita más información que solo el nombre de la impresora, puede usar la System.ManagementAPI para consultarlos:

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
fuente
8

Obtener lista de impresoras locales y de red en ASP.NET

Este método utiliza el Instrumental de administración de Windows o la interfaz WMI. Es una tecnología que se utiliza para obtener información sobre varios sistemas (hardware) que se ejecutan en un sistema operativo Windows.

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

Haga clic aquí para descargar la fuente y la demostración de la aplicación

Demostración de la aplicación que enumera la red y la impresora local

ingrese la descripción de la imagen aquí

Scratcher de código
fuente
¿Tu demo también está en ASP.NET?
AaA
5

También puede utilizar la clase LocalPrintServer. Ver: 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(); 
        } 
    }

Como se indica en los documentos: Las clases dentro del espacio de nombres System.Printing no son compatibles para su uso dentro de un servicio de Windows o una aplicación o servicio ASP.NET.

Hernán Alonso
fuente
¿Puede agregar una explicación para acompañar el código?
jhpratt
Esta es una respuesta muy interesante. Si solo necesita los nombres, la respuesta aceptada es correcta. Si necesita otros datos, usar la consulta a win32_Printer es mucho más lento que hacer esta llamada
Noman_1
0

Si está trabajando con MVC C #, esta es la forma de tratar las impresoras y los puertos serie para los menús desplegables.

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
fuente