it-swarm-id.com

Apa cara terbaik untuk mendapatkan printer default di .NET

Saya perlu mendapatkan nama printer standar. Saya akan menggunakan C # tetapi saya menduga ini lebih merupakan pertanyaan kerangka kerja dan tidak spesifik bahasa.

72
Kevin Gale

Cara termudah yang saya temukan adalah membuat objek PrinterSettings baru. Itu dimulai dengan semua nilai default, sehingga Anda dapat memeriksa properti Name untuk mendapatkan nama printer default.

PrinterSettings ada di System.Drawing.dll di namespace System.Drawing.Printing.

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

Sebagai alternatif, Anda mungkin dapat menggunakan metode PrinterSettings.InstalledPrinters Statis untuk mendapatkan daftar semua nama printer, kemudian atur properti PrinterName dan periksa IsDefaultPrinter. Saya belum mencoba ini, tetapi dokumentasi sepertinya menyarankan itu tidak akan berfungsi. Rupanya IsDefaultPrinter hanya benar ketika PrinterName tidak diatur secara eksplisit.

114
OwenP

Pendekatan lain menggunakan WMI (Anda harus menambahkan referensi ke System.Management Assembly):

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;
}
28
Nathan Baulch

Jika Anda hanya ingin nama printer tidak ada untungnya sama sekali. Tetapi WMI mampu mengembalikan sejumlah besar properti printer lainnya:

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

dan bukan hanya printer. Jika Anda tertarik pada segala jenis data terkait komputer, kemungkinan Anda bisa mendapatkannya dengan WMI. WQL (versi WMI dari SQL) juga merupakan salah satu kelebihannya.

11
Uros Calakovic

Saya selalu menggunakan dalam hal ini System.Printing.LocalPrintServer, yang juga memungkinkan untuk mendapatkan apakah printer itu lokal, jaringan, atau faks.

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

atau menggunakan metode statis GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
9

Coba juga contoh ini

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
1
Ramgy Borja
  • Pertama membuat instance objek PrintDialog.
  • kemudian panggil objek dialog cetak dan biarkan PrinterName kosong. ini akan menyebabkan objek windows mengembalikan nama printer defualt
  • tulis ini ke string dan gunakan itu sebagai nama printer ketika Anda memanggil prosedur cetak

Kode:

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
0
DieselDog

Ini seharusnya bekerja:

using System.Drawing.Printing;

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

0
Tahir