Cách lấy danh sách tất cả các máy in trong máy tính


99

Tôi cần lấy danh sách tất cả các máy in kết nối với máy tính?

Làm thế nào tôi có thể làm điều đó trong C #, WinForms?

Câu trả lời:


197

Thử cái này:

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

9
Chưa bao giờ nghĩ đến việc tìm kiếm điều này trong System.Drawing!
Olivier Jacot-Descombes

57

Nếu bạn cần thêm thông tin ngoài tên của máy in, bạn có thể sử dụng System.ManagementAPI để truy vấn chúng:

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

Nhận danh sách mạng và máy in cục bộ trong ASP.NET

Phương pháp này sử dụng Công cụ quản lý Windows hoặc giao diện WMI. Đó là một công nghệ được sử dụng để lấy thông tin về các hệ thống (phần cứng) khác nhau đang chạy trên Hệ điều hành 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());
            }
        }

Bấm vào đây để tải xuống nguồn và bản demo ứng dụng

Demo ứng dụng liệt kê mạng và máy in cục bộ

nhập mô tả hình ảnh ở đây


cũng là bản demo của bạn trong ASP.NET?
AaA

5

Bạn cũng có thể sử dụng lớp LocalPrintServer. Xem: 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(); 
        } 
    }

Như đã nêu trong tài liệu: Các lớp trong không gian tên Hệ thống. In không được hỗ trợ để sử dụng trong dịch vụ Windows hoặc ứng dụng hoặc dịch vụ ASP.NET.


Bạn có thể thêm giải thích để đi cùng với mã không?
jhpratt

Đây là một câu trả lời rất thú vị. Nếu bạn chỉ cần tên, câu trả lời được chấp nhận là đúng. Nếu bạn cần dữ liệu khác, việc sử dụng truy vấn tới win32_Printer sẽ chậm hơn so với thực hiện cuộc gọi này
Noman_1

0

Nếu bạn đang làm việc với MVC C #, đây là cách xử lý máy in và các cổng nối tiếp cho trình đơn thả xuống.

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);
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.