.NETでデフォルトのプリンタを取得するための最良の方法は何ですか


81

デフォルトのプリンタ名を取得する必要があります。私はC#を使用しますが、これはフレームワークの質問であり、言語固有ではないと思います。

回答:


130

私が見つけた最も簡単な方法は、新しいPrinterSettingsオブジェクトを作成することです。すべてのデフォルト値で開始されるため、Nameプロパティを確認して、デフォルトのプリンタの名前を取得できます。

PrinterSettings名前空間のSystem.Drawing.dllにありますSystem.Drawing.Printing

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

または、静的PrinterSettings.InstalledPrintersメソッドを使用してすべてのプリンター名のリストを取得し、PrinterNameプロパティを設定して、IsDefaultPrinterを確認することもできます。私はこれを試していませんが、ドキュメントはそれが機能しないことを示唆しているようです。どうやらIsDefaultPrinterは、PrinterNameが明示的に設定されていない場合にのみtrueになります。


6
InstalledPrintersから返される文字列は、PrinterNameプロパティとは大文字と小文字が異なる場合があることに注意してください。たとえば、このテストは私のシステムで失敗しました:Dim ps As New PrinterSettings Dim foundDefault As Boolean = False For Each printer As String In PrinterSettings.InstalledPrinters If printer = ps.PrinterName Then foundDefault = True End If Next Assert.IsTrue(foundDefault)
miasbeck

1
これが私のために働くループテクニックです。:foreach(PrinterSettings.InstalledPrintersの文字列名){PrinterSettings ps = new PrinterSettings(); ps.PrinterName =名前; if(ps.IsDefaultPrinter)return name; } nullを返します。
BrokeMyLegBiking

アプリをWindowsサービスとして実行している場合、この方法は機能しないことに注意してください。理由がわかりません。私はローカルサービスとして実行しています。
ルディ日ノ庄

@BrokeMyLegBikingこれはMSDNによると機能しないはずです:「PrinterNameプロパティをnull以外の文字列値に明示的に設定すると、IsDefaultPrinterは常にfalseを返します。」
jnm2 2017

これを「stringpName = new PrinterSettings()。PrinterName;」に要約できます。
PKanold

31

別のアプローチは、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;
}

2
新しいPrinterSettings()。PrinterNameを使用すると、デフォルトのプリンターが設定されている場合でも、プリンター名として「デフォルトのプリンターが設定されていません」と返されることがあります。Nathan Baulchによる上記のWMIソリューションは、そのような状況で機能しました。
ピーター

13

プリンタ名だけが必要な場合は、まったく利点がありません。ただし、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バージョン)もその利点の1つです。


10

この場合、私は常にSystem.Printing.LocalPrintServerを使用します。これにより、プリンターがローカル、ネットワーク、またはファックスのいずれであるかを取得することもできます。

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

または静的メソッドGetDefaultPrintQueueを使用する

LocalPrintServer.GetDefaultPrintQueue().FullName

2

この例も試してください

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;

1

これは機能するはずです:

using System.Drawing.Printing;

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


0
  • 最初にのインスタンスを作成します PrintDialogオブジェクトの。
  • 次に、印刷ダイアログオブジェクトを呼び出して、 PrinterName空白のます。これにより、windowsオブジェクトはデフォルトのプリンタ名を返します。
  • これを文字列に書き込み、印刷プロシージャを呼び出すときにプリンタ名として使用します

コード:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.