Cách tốt nhất để lấy máy in mặc định trong .NET là gì


81

Tôi cần lấy tên máy in mặc định. Tôi sẽ sử dụng C # nhưng tôi nghi ngờ đây là một câu hỏi khung nhiều hơn và không phải là ngôn ngữ cụ thể.

Câu trả lời:


129

Cách dễ nhất mà tôi tìm thấy là tạo một PrinterSettingsđối tượng mới . Nó bắt đầu với tất cả các giá trị mặc định, vì vậy bạn có thể kiểm tra Tên của nó để lấy tên của máy in mặc định.

PrinterSettingsnằm trong System.Drawing.dll trong không gian tên System.Drawing.Printing.

PrinterSettings settings = new PrinterSettings();
Console.WriteLine(settings.PrinterName);

Ngoài ra, bạn có thể sử dụng PrinterSettings.InstalledPrintersphương pháp tĩnh để lấy danh sách tất cả các tên máy in, sau đó đặt thuộc tính PrinterName và kiểm tra IsDefaultPrinter . Tôi chưa thử điều này, nhưng tài liệu cho thấy nó sẽ không hoạt động. Rõ ràng IsDefaultPrinter chỉ đúng khi PrinterName không được đặt rõ ràng.


6
Có lẽ điều đáng nói là các chuỗi được trả về từ InstalledPrinters có thể có cách viết khác với thuộc tính PrinterName. Ví dụ: kiểm tra này không thành công trên Hệ thống của tôi: Dim ps As New PrinterSettings Dim foundDefault As Boolean = False For Each máy in As String In PrinterSettings.InstalledPrinters If print = ps.PrinterName Then foundDefault = True End If Next Assert.IsTrue (foundDefault)
— miasbeck

1
Đây là kỹ thuật lặp, phù hợp với tôi. : foreach (tên chuỗi trong PrinterSettings.InstalledPrinters) {PrinterSettings ps = new PrinterSettings (); ps.PrinterName = tên; if (ps.IsDefaultPrinter) trả về tên; } trả về null;
— BrokeMyLegBiking

Xin lưu ý rằng phương pháp này không hoạt động nếu bạn chạy ứng dụng của mình dưới dạng dịch vụ windows. Tôi chưa hiểu tại sao. Tôi đang hoạt động như một dịch vụ địa phương.
— Rudy Hinojosa

@BrokeMyLegBiking Điều đó sẽ không hoạt động theo MSDN : "IsDefaultPrinter luôn trả về false khi bạn đặt thuộc tính PrinterName một cách rõ ràng thành giá trị chuỗi khác với null."
— jnm2

Bạn có thể cô đọng điều này thành 'string pName = new PrinterSettings (). PrinterName;'
— PKanold

31

Một cách tiếp cận khác là sử dụng WMI (bạn sẽ cần thêm một tham chiếu đến hội đồng System.Management):

public static string GetDefaultPrinterName()
{
    var query = new ObjectQuery("SELECT * FROM Win32_Printer");
    var searcher = new ManagementObjectSearcher(query);

    foreach (ManagementObject mo in searcher.Get())
    {
        if (((bool?) mo["Default"]) ?? false)
        {
            return mo["Name"] as string;
        }
    }

    return null;
}

2
Sử dụng Máy in mới (). PrinterName đôi khi trả về "Máy in mặc định chưa được đặt" làm tên máy in, ngay cả khi máy in mặc định ĐÃ được đặt. Giải pháp WMI ở trên của Nathan Baulch đã phù hợp với tôi trong tình huống như vậy.
— Peter

13

Nếu bạn chỉ muốn tên máy in không có lợi thế nào cả. Nhưng WMI có khả năng trả về một loạt các thuộc tính máy in khác:

using System;
using System.Management;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectQuery query = new ObjectQuery(
                "Select * From Win32_Printer " +
                "Where Default = True");

            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(query);

            foreach (ManagementObject mo in searcher.Get())
            {
                Console.WriteLine(mo["Name"] + "\n");

                foreach (PropertyData p in mo.Properties)
                {
                    Console.WriteLine(p.Name );
                }
            }
        }
    }
}

và không chỉ máy in. Nếu bạn quan tâm đến bất kỳ loại dữ liệu nào liên quan đến máy tính, rất có thể bạn có thể lấy nó bằng WMI. WQL (phiên bản WMI của SQL) cũng là một trong những ưu điểm của nó.


10

Trong trường hợp này, tôi luôn sử dụng System.Printing.LocalPrintServer, giúp bạn có thể lấy được máy in là cục bộ, mạng hay fax.

string defaultPrinter;
using(var printServer = new LocalPrintServer()) {
  defaultPrinter = printServer.DefaultPrintQueue.FullName);
}

hoặc sử dụng phương thức tĩnh GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName

2

Cũng thử ví dụ này

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;

1

Điều này sẽ hoạt động:

using System.Drawing.Printing;

PrinterSettings settings = new PrinterSettings(); string defaultPrinterName = settings.PrinterName;


0
  • Đầu tiên tạo một phiên bản của PrintDialog đối tượng.
  • sau đó gọi đối tượng hộp thoại in và để lại PrinterName trống. điều này sẽ khiến đối tượng windows trả về tên máy in defualt
  • ghi nó vào một chuỗi và sử dụng nó làm tên máy in khi bạn gọi thủ tục in

Mã:

Try

    Dim _printDialog As New System.Windows.Forms.PrintDialog

    xPrinterName = _printDialog.PrinterSettings.PrinterName '= "set as Default printer"

Catch ex As Exception
    System.Windows.Forms.MessageBox.Show("could not printed Label.", "Print Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.