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?

Odpowiedzi:


197

Spróbuj tego:

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    MessageBox.Show(printer);
}

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


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


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.


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);
        }
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.