web-dev-qa-db-ja.com

.NETでプリンター情報を取得する方法は?

標準のPrintDialogには、選択したプリンターに関連付けられた4つの値があります。ステータス、タイプ、場所、およびコメントです。

プリンターの名前がわかっている場合、C#2.0でこれらの値を取得するにはどうすればよいですか?

46
Nick Gotch

dowski推奨 のように、WMIを使用してプリンターのプロパティを取得できます。次のコードは、特定のプリンター名のすべてのプロパティを表示します。それらの中には、PrinterStatus、Comment、Location、DriverName、PortNameなどがあります。

using System.Management;

...

string printerName = "YourPrinterName";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
using (ManagementObjectCollection coll = searcher.Get())
{
    try
    {
        foreach (ManagementObject printer in coll)
        {
            foreach (PropertyData property in printer.Properties)
            {
                Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
            }
        }
    }
    catch (ManagementException ex)
    {
        Console.WriteLine(ex.Message);
    }
}
71
Panos

このshouldは機能します。

_using System.Drawing.Printing;
_

...

_PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting
_

その後、PrinterSettingsのさまざまな properties を読み取ることができます。

ps.isValid()は、プリンターが実際に存在するかどうかを確認できることに注意してください。

編集:1つの追加コメント。 PrinterSettingsを直接作成するのではなく、 PrintDocument を使用してPrinterSettingsを変更することをお勧めします。

23
Powerlord

PrinterSettings.InstalledPrinters を見てください

6
John Sheehan

dowskiおよびPanosは( MSDN Win32_Printer )を参照していたため、少し誤解を招く可能性があります。

ほとんどの配列の最初の値を参照しています。一部は1で始まり、一部は0で始まります。たとえば、「ExtendedPrinterStatus」テーブルの最初の値は1です。したがって、配列は次のようになります。

string[] arrExtendedPrinterStatus = { 
    "","Other", "Unknown", "Idle", "Printing", "Warming Up",
    "Stopped Printing", "Offline", "Paused", "Error", "Busy",
    "Not Available", "Waiting", "Processing", "Initialization",
    "Power Save", "Pending Deletion", "I/O Active", "Manual Feed"
};

一方、「ErrorState」テーブルの最初の値は0です。したがって、配列は次のようになります。

string[] arrErrorState = {
    "Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
    "No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
    "Output Bin Full"
};

ところで、「PrinterState」は廃止されましたが、「PrinterStatus」を使用できます。

3
itsho

参照用に、 here は、プリンターManagementObjectで使用可能なすべてのプロパティのリストです。

usage: printer.Properties["PropName"].Value
3
David

Windows環境で作業してから長い時間が経ちましたが、 sing WMI をご覧になることをお勧めします。

2
dowski

古い投稿であることは知っていますが、最近では、WPFフレームワークが提供する拡張印刷サービス(非WPFアプリで使用可能)を使用するのがより簡単/おかしいオプションです。

http://msdn.Microsoft.com/en-us/library/System.Printing(v = vs.110).aspx

プリンターキューと最初のジョブのステータスを取得する例.

var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus
2
stoj

WMIの代替として、WinSpool.drv(つまり、Windows API)をタップすることにより、高速で正確な結果を得ることができます-インターフェイス、構造体、および定数に関するすべての詳細をpinvoke.netから取得するか、コードをまとめました http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

0
MarkMiddlemist