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

如果我知道打印机的名称,我怎样才能在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()可以查看打印机是否确实存在。

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

请注意, dowski Panos 的文章正在提供( MSDN Win32_Printer )可能会有点误导。

我指的是大多数数组的第一个值。一些以1开头,一些以0开头。 例如,<!>; ExtendedPrinterStatus <!> quot;表中的第一个值是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"
};

顺便说一句, QUOT <!>; PrinterState QUOT <!>;已过时,但您可以使用<!>“ PrinterStatus <!>”。

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

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

自从我在Windows环境中工作已经很长时间了,但我建议您查看使用WMI

我知道这是一个旧帖子,但现在更容易/更快的选择是使用WPF框架提供的增强打印服务(非WPF应用程序可用)。

http://msdn.microsoft的.com / EN-US /库/ 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top