如何在.NET中获取打印机信息?

50

在标准的PrintDialog中,与所选打印机相关联的有四个值:状态、类型、位置和注释。

如果我知道打印机的名称,如何在C# 2.0中获取这些值?

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

25

这个应该可以工作。

using System.Drawing.Printing;

...

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

之后,可以读取PrinterSettings的各种属性

请注意,ps.isValid()可以查看打印机是否实际存在。

编辑:另外一条注释。Microsoft建议您使用PrintDocument并修改其PrinterSettings,而不是直接创建PrinterSettings。


这个不起作用。在我的情况下,它没有更新属性(例如CanDuplex)。此外,文档中说IsDefaultPrinter“获取一个值,该值指示PrinterName属性是否指定默认打印机,除非用户明确设置了PrinterName。” - koraljko


4

仅供参考,这里列出了打印机ManagementObject的所有可用属性列表。

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

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"。

3

我很久没有在Windows环境下工作了,但我建议您看一下使用WMI


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

LocalPrintServer和从GetPrintQueue返回的队列都是IDisposable,因此您应该在using调用中包装它。 使用以下代码: using (var lps = new LocalPrintServer()) { using (var queue = lps.GetPrintQueue(printerName)) { var queueStatus = queue.QueueStatus; var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus; } } - crunchy

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接