调用特定打印机以打印C# WPF

4

我希望在我的WPF应用程序中调用特定的打印机进行打印。 我有三台打印机, 假设 打印机1用于酒吧账单打印 打印机2用于厨房账单打印 打印机3用于客人账单打印。 打印机名称已保存在数据库中,打印时我从数据库获取打印机名称,并希望从特定的打印机打印,而不是默认打印机。 以下是我的代码:

var v = new PrinterDAL().GetPrinterSettings();
try
{
   System.Threading.Thread thread = new System.Threading.Thread(new 
      System.Threading.ThreadStart(
            delegate()
            {   
                gridPrint.Dispatcher.Invoke(DispatcherPriority.Normal,
                    new Action(
                    delegate()
                    {
                            PrintDialog printDialog = new PrintDialog();
                            printDialog.PrintQueue = new PrintQueue(
                                new PrintServer(@"\\" + v.BarPrinter), "");
                            printDialog.PrintVisual(gridPrint, "");
                            this.Close();
                    }
                ));
            }
            ));
            thread.Start();
}
catch (Exception ex)
{
     Xceed.Wpf.Toolkit.MessageBox.Show(ex.Message, "", MessageBoxButton.OK, 
                                       MessageBoxImage.Error);
}

我从这段代码中得到一个异常信息:“在创建PrintServer对象时发生异常。Win32错误:打印机名称无效。”

鉴于我们不是心灵读者 - v.BarPrinter 包含什么? - Damien_The_Unbeliever
它包含了打印机的名称,这就是错误所在。你能打印出名称并检查为什么.NET无法与打印机通信吗? - Legoless
如果答案正确,请将其标记为已接受。其他人可以更快地找到答案。 - jlvaquero
我已标记为正确 - Kashif Hanif
在系统中似乎不正确。只是对有用性的+1。如果它看起来是最佳答案,那么请接受它作为最佳答案...当然,这取决于你的判断。 - jlvaquero
1个回答

9

打印服务器必须使用计算机或打印机服务器设备的UNC格式(\\resource)进行实例化,而不是打印机名称:

例如,如果您的计算机在域中的名称为KashifPC,并且您已经配置了一个名为“Printer1”的打印机,则可以使用以下内容:

//example code. no error handling.
PrintServer localPS = New PrintServer(@"\\KashifPC")
PrinterQueue printer1 = localPS.GetPrintQueue("Printer1") //v.BarPrinter???
PrintDialog printDialog = new PrintDialog();
printDialog.PrintQueue = printer1
//rest of code

jlvaquero,你真是太棒了。非常感谢你,这解决了我的问题。我已经遇到这个问题三天了……谢谢。 - Kashif Hanif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接