获取打印机后台处理程序名称和连接类型

Posted

技术标签:

【中文标题】获取打印机后台处理程序名称和连接类型【英文标题】:Get Printer Spooler Name & Connection Type 【发布时间】:2016-04-14 01:33:51 【问题描述】:

我正在为使用 C# 的应用程序创建一个小插件,以根据正在打印的文档自动切换打印机。使用 c# 我有一个系统上安装的打印机列表,但需要确定每个打印机的 Spooler ID/名称和连接类型。

本质上,我正在更改主机应用程序用于处理在下次打印时使用的默认打印机的注册表项,该值采用打印机名称的格式;后台打印程序,连接类型,对于不同的打印机来说似乎是唯一的。

这是我需要构造的值的示例:HP LaserJet 5500,winspool,Ne01:

我有打印机名称,只是不确定如何检索每台打印机的其他参数。

我用来检索打印机列表的代码片段依赖于 System.Drawing;

foreach (string printer in PrinterSettings.InstalledPrinters)

    Console.WriteLine(printer);

    var printerSettings = new PrinterSettings();
    Console.WriteLine(printerSettings.PrinterName);

【问题讨论】:

【参考方案1】:

我不知道这是否对您有更多帮助,或者至少对您的最终结果有更深的帮助。我有类似的需要查看打印机组件/驱动程序设置并拥有它。尽管我的机器上的打印机的每种可能类型都有一个开关/外壳,但可能还有其他类型,您可以暂停并深入了解更多可能是更深嵌套元素的设置。在 queue.DefaultPrintTicket 上找到了我需要的一个,以确定标签打印机的 x/y 页面分辨率。

using System.Printing;

        var ps = new PrintServer();
        var queues = ps.GetPrintQueues(
            new[]  EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections );

        // The AMSConfig table has width of 70 for binding to match.
        StringBuilder sb = new StringBuilder();
        foreach (var queue in queues)
        
            sb.AppendLine( queue.Name );
            if (queue.PropertiesCollection == null)
                continue;

            foreach (System.Collections.DictionaryEntry ppd in queue.PropertiesCollection)
            
                switch( ppd.Value.ToString() )
                
                    case "System.Printing.IndexedProperties.PrintStringProperty":
                        var psp = ppd.Value as System.Printing.IndexedProperties.PrintStringProperty;
                        sb.AppendLine(ppd.Key + " : " + psp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintInt32Property":
                        var pip = ppd.Value as System.Printing.IndexedProperties.PrintInt32Property;
                        sb.AppendLine(ppd.Key + " : " + pip.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintTicketProperty":
                        var ptp = ppd.Value as System.Printing.IndexedProperties.PrintTicketProperty;
                        sb.AppendLine(ppd.Key + " : " + ptp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintBooleanProperty":
                        var pbp = ppd.Value as System.Printing.IndexedProperties.PrintBooleanProperty;
                        sb.AppendLine(ppd.Key + " : " + pbp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintQueueStatusProperty":
                        var pstap = ppd.Value as System.Printing.IndexedProperties.PrintQueueStatusProperty;
                        sb.AppendLine(ppd.Key + " : " + pstap.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintQueueAttributeProperty":
                        var pap = ppd.Value as System.Printing.IndexedProperties.PrintQueueAttributeProperty;
                        sb.AppendLine(ppd.Key + " : " + pap.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintProcessorProperty":
                        var ppp = ppd.Value as System.Printing.IndexedProperties.PrintProcessorProperty;
                        sb.AppendLine(ppd.Key + " : " + ppp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintPortProperty":
                        var pportp = ppd.Value as System.Printing.IndexedProperties.PrintPortProperty;
                        sb.AppendLine(ppd.Key + " : " + pportp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintServerProperty":
                        var psvrp = ppd.Value as System.Printing.IndexedProperties.PrintServerProperty;
                        sb.AppendLine(ppd.Key + " : " + psvrp.Value);
                        break;

                    case "System.Printing.IndexedProperties.PrintDriverProperty":
                        var pdp = ppd.Value as System.Printing.IndexedProperties.PrintDriverProperty;
                        sb.AppendLine(ppd.Key + " : " + pdp.Value);
                        break;
                
            

            sb.AppendLine("");
            sb.AppendLine("");
        

        System.IO.File.WriteAllText( "PrinterInfo.txt", sb.ToString());

因此,在此结束时,我会得到每台打印机的***列表,例如...

PaperPort Image Printer
SeparatorFile : 
Location : 
UntilTimeOfDay : 0
ShareName : 
Name : PaperPort Image Printer
Priority : 1
AveragePagesPerMinute : 0
UserPrintTicket : 
IsXpsEnabled : False
DefaultPrintTicket : 
QueueStatus : None
QueueAttributes : 65
StartTimeOfDay : 0
QueuePrintProcessor : System.Printing.PrintProcessor
QueuePort : System.Printing.PrintPort
DefaultPriority : 1
Comment : 
Description : \\[machine]\PaperPort Image Printer,Nuance Image Printer Driver,
HostingPrintServer : 
QueueDriver : System.Printing.PrintDriver
NumberOfJobs : 0

同样,其中一些对象的值是其他对象的值,需要更深入地研究,例如获得一个 COM 端口,但同样,这应该会让您了解更多细节,并希望找到您需要的东西。

【讨论】:

感谢@DRapp 的建议。不幸的是,我无法找到我正在寻找的参数,但设法部署了一个有效的解决方案。天真地,在更改默认打印机时检查注册表值并注意到每台打印机的唯一值后,我假设最后两个参数需要反映我在操作系统中切换时看到的内容。我不知道为什么,但是如果我按照示例“打印机名称,winspool,Ne01:”离开并简单地更改打印机的名称,它就可以工作。真希望我在问之前尝试过!感谢您的帮助

以上是关于获取打印机后台处理程序名称和连接类型的主要内容,如果未能解决你的问题,请参考以下文章

操作无法完成错误0x0000709再次检查打印机名称?

Windows 无法打开“添加打印机”。本地打印后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。

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

直接访问 Windows 后台处理程序中列出的 USB 打印机端口

从 USB 打印机记录原始数据并使用打印后台处理程序

Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案