Cara mendapatkan daftar semua printer di komputer

99

Saya perlu mendapatkan daftar semua printer yang terhubung ke komputer?

Bagaimana saya bisa melakukannya di C #, WinForms?

Emas
sumber

Jawaban:

197

Coba ini:

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    MessageBox.Show(printer);
}
Jojo Sardez
sumber
9
Tidak pernah terpikir untuk mencari ini di System.Drawing!
Olivier Jacot-Descombes
57

Jika Anda memerlukan informasi lebih dari sekedar nama printer, Anda dapat menggunakan System.ManagementAPI untuk menanyakannya:

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

Dapatkan Jaringan dan Daftar Printer Lokal di ASP.NET

Metode ini menggunakan Instrumentasi Manajemen Windows atau antarmuka WMI. Ini adalah teknologi yang digunakan untuk mendapatkan informasi tentang berbagai sistem (perangkat keras) yang berjalan pada Sistem Operasi 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());
            }
        }

Klik di sini untuk mengunduh demo sumber dan aplikasi

Demo aplikasi yang mencantumkan jaringan dan printer lokal

masukkan deskripsi gambar di sini

Code Scratcher
sumber
apakah demo Anda di ASP.NET juga?
AaA
5

Anda juga dapat menggunakan kelas LocalPrintServer. Lihat: 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(); 
        } 
    }

Seperti yang dinyatakan dalam dokumen: Kelas dalam Sistem. Ruang nama pencetakan tidak didukung untuk digunakan dalam layanan Windows atau aplikasi atau layanan ASP.NET.

Hernan Alonso
sumber
Bisakah Anda menambahkan penjelasan untuk menyertai kode?
jhpratt
Ini jawaban yang sangat menarik. Jika Anda hanya membutuhkan nama, jawaban yang diterima benar. Jika Anda membutuhkan data lain, menggunakan kueri untuk win32_Printer jauh lebih lambat daripada melakukan panggilan ini
Noman_1
0

Jika Anda bekerja dengan MVC C #, ini adalah cara untuk menangani printer dan port serial untuk dropdown.

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
sumber