49

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

如果我知道打印机的名称,如何在 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()可以查看打印机是否真的存在。

编辑:一条附加评论。Microsoft 建议您使用PrintDocument并修改其 PrinterSettings,而不是直接创建 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 回答