Каков наилучший способ получить принтер по умолчанию в .NET.

Мне нужно получить имя принтера по умолчанию. Я буду использовать С#, но я подозреваю, что это больше вопрос рамки и не зависит от языка.

Ответ 1

Самый простой способ - создать новый объект PrinterSettings. Он начинается со всех значений по умолчанию, поэтому вы можете проверить его свойство Name, чтобы получить имя принтера по умолчанию.

PrinterSettings находится в System.Drawing.dll в пространстве имен System.Drawing.Printing.

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

В качестве альтернативы вы можете использовать статический метод PrinterSettings.InstalledPrinters для получения списка всех имен принтеров, затем установить свойство PrinterName и проверить IsDefaultPrinter. Я не пробовал это, но документация, похоже, предполагает, что это не сработает. Очевидно, что IsDefaultPrinter имеет значение true, только когда PrinterName явно не задано.

Ответ 2

Другой подход - использование WMI (вам нужно добавить ссылку на сборку 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;
}

Ответ 3

Если вы просто хотите, чтобы имя принтера не имело никакого преимущества. Но WMI способен возвращать целую кучу других свойств принтера:

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

а не только принтеры. Если вас интересуют какие-либо данные, связанные с компьютером, возможно, вы можете получить его с помощью WMI. WQL (версия SQL WMI) также является одним из его преимуществ.

Ответ 4

В этом случае я всегда использую System.Printing.LocalPrintServer, который также позволяет получить, является ли принтер локальным, сетевым или факсимильным.

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

или используя статический метод GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName

Ответ 5

Попробуйте также этот пример

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;

Ответ 6

  • Создайте экземпляр объекта PrintDialog.
  • затем вызовите объект диалога печати и оставьте пробел PrinterName. это заставит объект Windows вернуть имя принтера defualt
  • записать это в строку и использовать ее в качестве имени принтера при вызове процедуры печати

код:

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

Ответ 7

Это должно работать:

using System.Drawing.Printing;

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