Is there a straightforward way to enumerate all visible network printers in .NET? Currently, I\'m showing the PrintDialog to allow the user to select a printer. The problem
LocalPrintServer.DefaultPrintQueuePrinterSettings.InstalledPrinters\\ is a network printer - so get the queue with new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")\\ is a local printer so get it with LocalPrintServer.GetQueue("Name")FullName property. Note: a network printer can be the default printer from LocalPrintServer.DefaultPrintQueue, but not appear in LocalPrintServer.GetPrintQueues()
// get available printers
LocalPrintServer printServer = new LocalPrintServer();
PrintQueue defaultPrintQueue = printServer.DefaultPrintQueue;
// get all printers installed (from the users perspective)he t
var printerNames = PrinterSettings.InstalledPrinters;
var availablePrinters = printerNames.Cast().Select(printerName =>
{
var match = Regex.Match(printerName, @"(?\\\\.*?)\\(?.*)");
PrintQueue queue;
if (match.Success)
{
queue = new PrintServer(match.Groups["machine"].Value).GetPrintQueue(match.Groups["queue"].Value);
}
else
{
queue = printServer.GetPrintQueue(printerName);
}
var capabilities = queue.GetPrintCapabilities();
return new AvailablePrinterInfo()
{
Name = printerName,
Default = queue.FullName == defaultPrintQueue.FullName,
Duplex = capabilities.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge),
Color = capabilities.OutputColorCapability.Contains(OutputColor.Color)
};
}).ToArray();
DefaultPrinter = AvailablePrinters.SingleOrDefault(x => x.Default);