Jak uzyskać listę wszystkich drukarek w komputerze

99

Czy muszę uzyskać listę wszystkich drukarek, które łączą się z komputerem?

Jak mogę to zrobić w C #, WinForms?

Złoto
źródło

Odpowiedzi:

197

Spróbuj tego:

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    MessageBox.Show(printer);
}
Jojo Sardez
źródło
9
Nigdy nie myślałem o szukaniu tego w System.Drawing!
Olivier Jacot-Descombes
57

Jeśli potrzebujesz więcej informacji niż tylko nazwa drukarki, możesz skorzystać z System.Managementinterfejsu API, aby je zapytać:

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
źródło
8

Uzyskaj listę drukarek sieciowych i lokalnych w ASP.NET

Ta metoda korzysta z Instrumentacji zarządzania Windows lub interfejsu WMI. Jest to technologia używana do uzyskiwania informacji o różnych systemach (sprzęcie) działających w systemie operacyjnym 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());
            }
        }

Kliknij tutaj, aby pobrać źródło i wersję demonstracyjną aplikacji

Wersja demonstracyjna aplikacji zawierająca listę drukarek sieciowych i lokalnych

wprowadź opis obrazu tutaj

Code Scratcher
źródło
czy twoje demo jest też w ASP.NET?
AaA
5

Możesz także użyć klasy LocalPrintServer. Zobacz: 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(); 
        } 
    }

Jak stwierdzono w dokumentacji: Klasy w przestrzeni nazw System.Printing nie są obsługiwane w ramach usługi systemu Windows lub aplikacji lub usługi ASP.NET.

Hernan Alonso
źródło
Czy możesz dodać wyjaśnienie do kodu?
jhpratt
To bardzo interesująca odpowiedź. Jeśli potrzebujesz tylko nazwisk, zaakceptowana odpowiedź jest prawidłowa. Jeśli potrzebujesz innych danych, użycie zapytania do win32_Printer jest znacznie wolniejsze niż wykonanie tego wywołania
Noman_1
0

Jeśli pracujesz z MVC C #, jest to sposób na radzenie sobie z drukarkami i portami szeregowymi dla list rozwijanych.

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
źródło