49

標準の PrintDialog には、選択したプリンターに関連付けられた 4 つの値 (Status、Type、Where、および Comment) があります。

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

4

8 に答える 8

74

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);
    }
}
于 2008-11-17T18:11:53.410 に答える
24

これはうまくいくはずです。

using System.Drawing.Printing;

...

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

その後、PrinterSettingsのさまざまなプロパティを読み取ることができます。

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

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

于 2008-11-17T17:42:47.243 に答える
7

PrinterSettings.InstalledPrintersを見てください。

于 2008-11-17T17:32:44.253 に答える
4

参考までに、プリンターの ManagementObject で使用できるすべてのプロパティの一覧を次に示します

usage: printer.Properties["PropName"].Value
于 2012-01-13T21:32:33.007 に答える
3

Windows 環境での作業は久しぶりですが、WMI の使用を検討することをお勧めします。

于 2008-11-17T17:23:09.607 に答える
3

dowskiPanosが参照していた記事( 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」を使用できます。

于 2011-08-14T19:51:42.000 に答える
2

古い投稿であることは承知していますが、最近では、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
于 2014-11-04T15:04:15.043 に答える
0

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

于 2012-02-27T12:43:44.540 に答える