.NETでプリンター情報を取得する方法は?
-
08-07-2019 - |
質問
標準のPrintDialogには、選択したプリンターに関連付けられた4つの値があります。ステータス、タイプ、場所、コメントです。
プリンタの名前がわかっている場合、C#2.0でこれらの値を取得するにはどうすればよいですか
解決
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);
}
}
他のヒント
これは動作するはずです 。
using System.Drawing.Printing;
...
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting
その後、さまざまな PrinterSettingsのプロパティを読み取ることができます。
ps.isValid()
は、プリンターが実際に存在するかどうかを確認できることに注意してください。
編集:1つの追加コメント。マイクロソフトでは、 PrintDocument を使用することをお勧めしますPrinterSettingsを直接作成するのではなく、PrinterSettingsを変更します。
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 "を使用できます。
参照用、ここは、プリンタManagementObjectで利用可能なすべてのプロパティのリストです。
usage: printer.Properties["PropName"].Value
Windows環境で作業してから長い時間が経ちましたが、 WMIを使用。
古い投稿であることは知っていますが、最近では、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
WMIの代替として、WinSpool.drv(つまり、Windows API)をタップすることにより、高速で正確な結果を取得できます-インターフェイス、構造体、およびアンプに関するすべての詳細を取得できます。 pinvoke.netの定数、または http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html