我的任务是通过热敏打印机打印标签。为此,生成一串tspl(打印机可识别的编程语言)命令并将其发送到打印机。后者在C#实现从微软例子"How to send raw data to a printer by using Visual C# .NET"通过重定向打印机打印标签
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
MessageBox.Show("Error " + dwError);
}
return bSuccess;
}
采取以下方法实际打印机的PrintDialog类
private void button2_Click(object sender, EventArgs e)
{
string s = "CLS\nPRINT 1\n"; // device-dependent string, need a FormFeed?
// Allow the user to select a printer.
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
// Send a printer-specific to the printer.
RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
}
}
选择在我的工作环境,一切工作正常。环境是一个局域网,包括3台计算机和1台共享热敏打印机:
- PC_with_printer - 它运行在Windows 7和具有经由USB
- 连接到它的打印机PC_aware - 它运行在Win 8上,并且知道共享打印机
- PC_unaware - 它运行在WinXP上,并且没有共享打印呃安装
从PC_aware我通过rdp连接到PC_unaware和打印机出现在打印机列表中作为重定向。然后我运行我的应用程序,选择重定向的打印机并打印我的空标签。到现在为止还挺好。
我将PC_unaware替换为另一台计算机时出现问题。它运行在Windows Server 2008 R2上,不在我们的LAN中。我们称之为服务器。于是我进行了同样的实验:
- 从PC_aware我使用它的公共IP地址通过RDP连接到服务器
- 我的热敏打印机出现在“打印机和设备”作为“TSC_TDP-244(重定向20)”
- 我去打印机的属性,然后单击打印测试页,它会打印
- 我运行我的应用程序和打印机不打印任何东西。
我已检查,其将在SendBytesToPrinter方法中使用的所有WINAPI函数的返回值(OpenPrinter,StartDocPrinter,StartPagePrinter,WritePrinter,EndPagePrinter,EndDocPrinter,ClosePrinter),其中没有指示错误。任何想法为什么会发生,以及如何解决它?
这实际上更像是一个远程桌面问题。由于PC_unaware没有局域网连接,并且共享打印机尚未安装,所以它依赖于RD的打印机克隆功能,我一直发现这种功能是有问题的。 RD对你想解决的问题真的很重要吗?如果没有,我会把它从图片中删除。 – 2015-04-01 14:22:45
此打印功能应该在服务器上提供,用户通过rdp连接到它,所以我担心RD是必不可少的部分。 – zurab 2015-04-01 14:51:39
我不知道RD如何实现打印机克隆,但是我强烈怀疑它依赖于卷入程序,这意味着直接写入克隆打印机将无法工作。 RD中需要很多复杂的代码才能支持直接打印,而且我很少会猜测他们没有实现它。 – 2015-04-01 15:10:27