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?

Jawaban:


197

Coba ini:

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

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


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


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.


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);
        }
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.