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

Posted

技术标签:

【中文标题】如何在 .NET 中获取打印机信息?【英文标题】:How to get Printer Info in .NET? 【发布时间】:2010-09-22 17:02:16 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

作为dowski suggested,您可以使用 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);
    

【讨论】:

【参考方案2】:

应该工作。

using System.Drawing.Printing;

...

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

之后就可以读取PrinterSettings的各种properties了。

注意ps.isValid()可以查看打印机是否真的存在。

编辑:一个额外的评论。 Microsoft 建议您使用 PrintDocument 并修改其 PrinterSettings 而不是直接创建 PrinterSettings。

【讨论】:

【参考方案3】:

看PrinterSettings.InstalledPrinters

【讨论】:

【参考方案4】:

仅供参考,here 是打印机 ManagementObject 的所有可用属性的列表。

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

【讨论】:

【参考方案5】:

很久没在Windows环境下工作了,建议大家看看using WMI。

【讨论】:

【参考方案6】:

请注意 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”。

【讨论】:

【参考方案7】:

我知道这是一个旧帖子,但现在更简单/更快的选择是使用 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 调用中。使用 (var lps = new LocalPrintServer()) 使用 (var queue = lps.GetPrintQueue(printerName)) var queueStatus = queue.QueueStatus; var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus; 【参考方案8】:

作为 WMI 的替代方案,您可以通过访问 WinSpool.drv(即 Windows API)来获得快速准确的结果 - 您可以从 pinvoke.net 获取有关接口、结构和常量的所有详细信息,或者我已经把代码一起在http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

【讨论】:

以上是关于如何在 .NET 中获取打印机信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vb .net 中获取任何已连接打印机的型号

如何打印与 phpinfo() 类似的信息,但用于 ASP.NET?

如何在 ASP.NET 中获取登录用户信息

如何在散列中获取Powershell ACL信息以便很好地打印到文件中

如何使用 Net Core 在 DbContext 中获取用户信息

如何在 VB.NET 中自动获取 SMTP 详细信息,如在 Thunderbird 中