检索excel.ActivePrinter的端口名称

嗨打印方法在Excel上工作我需要像这样的printername和端口名称:“打印机上NE3”只是一个例子。 问题是,我使用虚拟打印机和端口是不同的,几乎每次我需要使用它。

该程序需要在后台运行,所以打开的对话框select不是一个选项。 我也尝试从WMI中检索端口名称:

protected string FindPrinterWithPort(string printerName) { StringBuilder query = new StringBuilder(); query.Append("SELECT * FROM Win32_Printer "); query.Append("WHERE DeviceID = \""+printerName+"\""); ObjectQuery objectQuery = new ObjectQuery(query.ToString()); var searcher = new ManagementObjectSearcher(objectQuery); foreach (ManagementObject mo in searcher.Get()) { return printerName +" On "+ mo["PortName"]; } return string.Empty; } 

我收到的端口名为我提供了虚拟打印机程序的完整path。 我以前使用下面的方法来改变打印机的excel,而且我总是知道它们应该最终被改变,代码既不快也不好,但它工作了一段时间,直到我做了multithreading,它只是一个大封锁。 因为我需要locking这些方法不要更改Windows中的默认打印机。

  private bool SetPrinterForExcel(string printerName){ string[] ports = new string[]{"Ne00:", "Ne01:", "Ne02:", "Ne03:", "Ne04:", "Ne05:", "Ne06:", "Ne07:", "Ne08:", "Ne09:", "Ne10:", "Ne11:", "Ne12:", "Ne13:", "Ne14:", "Ne15:", "Ne16:", "LPT1:", "LPT2:", "File:", "SMC100:"}; foreach (string port in ports) { string printerWithPort = printerName + " On " + port; bool success = SetAndTestPrinter(printerWithPort); if(success) return true; } return false; } private bool SetAndTestPrinter(string printerWithPort) { try { excel.ActivePrinter = printerWithPort; return true; } catch { return false; } } 

任何想法如何检索端口,或者有没有办法从WMI查询我可以得到正确的端口。

提前致谢

编辑:

我没有得到它的工作得到,我已经做了打印现在是更改Windows上的默认打印机,然后只是在我的Excel对象的打印方法。 我改变了它使用:

  [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SetDefaultPrinter(string Name); 

我locking它的方法和打印。 我曾想过试图locking并保存ActivePrinter,即使我相信性能会正常的一样糟糕。 因为锁将保持到默认打印机被更改,有时最多1秒,在一个multithreading的环境,这是一个非常长的锁。

  string printernamewithPort = string.Empty; lock (ActivePrinterLock) { SetDefaultPrinter(printername); printernamewithPort = excel.ActivePrinter; } foreach (Worksheet worksheet in workbook.Worksheets) { worksheet.PageSetup.PaperSize = XlPaperSize.xlPaperA4; worksheet.PageSetup.Orientation = XlPageOrientation.xlPortrait; worksheet.PageSetup.FitToPagesWide = 1; worksheet.PageSetup.FitToPagesTall = false; worksheet.PrintOutEx(ActivePrinter: printernamewithPort,Collate: true, Preview: false, PrintToFile: false); } 

我不知道的是,如果默认的打印机立即改变另一个线程,如果它失去了给虚拟打印机的端口。 我没有做过适当的testing。 在正常情况下,我的方法FindPrinterWithPort似乎工作。