Windows 需要一种能驱动两台打印机的快速编程语言

Windows 需要一种能驱动两台打印机的快速编程语言,windows,printing,Windows,Printing,我有一个非常不寻常的应用程序,它没有按我需要的方式工作,我希望这里的人会有一些建议,或者至少有一个调查的方向 我们有一个博物馆展览,在入口处有一台电脑驱动两台小型收据打印机。控制台上有两个按钮,分别连接到一个取出内脏的鼠标的左右按钮。这两台打印机和相关的按钮是为女孩和男孩设计的,每个按钮都从姓名数据库中随机选择,并在适当的打印机上打印一张小票,上面有一张图形图像、几句关于展品的话和随机选择的姓名 从概念上讲,一切都很好,但它经常挂起。我在最后一刻得到了这个项目,因为最初的设计师陷入了困境,无法交

我有一个非常不寻常的应用程序,它没有按我需要的方式工作,我希望这里的人会有一些建议,或者至少有一个调查的方向

我们有一个博物馆展览,在入口处有一台电脑驱动两台小型收据打印机。控制台上有两个按钮,分别连接到一个取出内脏的鼠标的左右按钮。这两台打印机和相关的按钮是为女孩和男孩设计的,每个按钮都从姓名数据库中随机选择,并在适当的打印机上打印一张小票,上面有一张图形图像、几句关于展品的话和随机选择的姓名

从概念上讲,一切都很好,但它经常挂起。我在最后一刻得到了这个项目,因为最初的设计师陷入了困境,无法交付,所以展览的作者在开幕前一天问我,我是否可以写一些有用的东西

因为我是一名经验丰富的VBA程序员,所以我用Word完成了这项工作。我首先尝试的其他几种方法都是死路一条——一种无法绘制图形,另一种无法处理两台打印机,还有一种无法更改字体等等。问题是它的速度不够快——Word一次只能驱动一台打印机,而更改活动打印机需要很长时间。按照办公室的标准,在打印机开始处理文档之前,一两秒钟的延迟不是问题,但在这里,我需要或多或少的即时响应。如果孩子们按下一个按钮而什么也没发生,他们会反复按下按钮直到有事情发生,结果可能会在打印机开始反应之前发送六条命令。有时它会完全堵塞程序,因为男孩和女孩会同时按下这两个按钮,单词就会锁定,即使没有堵塞,打印机也会吐出一连串的票,弄得一团糟。孩子们开始为哪张票是谁的而争吵,把他们从打印机里拉出来,乱缠纸带,卡住打印机,把整个事情搞得一团糟,经常迫使展览管理员重新启动电脑,清理打印机上撕碎的纸片

我需要的是某种快速编程语言,它可以同时驱动两台打印机*-*,而不是MSOffice必须切换活动打印机时的哗众取宠,它可以对鼠标左键和右键点击事件作出反应,可以打印小的图形图像,并可以打印不同的字体大小和样式。我不需要很多,但不是一种字体


有人能建议我用什么吗?我甚至不知道在Windows下是否可能,是否“单个活动打印机”垃圾是办公室工件,还是Windows限制。25年前,我的小Commodore-64连接了两台打印机,并且两台打印机同时驱动,没有任何困难——在我看来,今天这不是一个不可能的要求。

这不是编程语言的问题,只是您使用的打印机堆栈的限制

我不确定.NET是否支持它(或者Windows是否支持在线程上发送打印)。您可以将每台打印机放在自己的线程中,并阻止UI接受更多打印请求


您还可以尝试为两台打印机启用打印后台处理。这将在本地进行渲染,然后返回打印。

几年前我写了一篇文章(使用VB6,因此可能很容易移植到VBA),它绕过了打印机驱动程序(必须设置打印机,但实际使用的驱动程序不相关),并将原始命令发送到打印机。根据您使用的打印机类型,这可能是问题,也可能不是问题(有些使用复杂的转义序列)。如果您想打印图形,这可能会增加另一层复杂性——尽管如果您知道打印机支持什么命令,也可以这样做。我设法在点阵打印机上打印位图,但这不是一项5分钟的任务。如果这是你感兴趣的东西,我可以试着找出代码吗

代码如下:

Public Type DOCINFO
          pDocName As String
          pOutputFile As String
          pDatatype As String
      End Type

Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Declare Function EndDocPrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Declare Function EndPagePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, ByVal pDefault As Long) As Long

Declare Function StartDocPrinter Lib "winspool.drv" Alias "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pDocInfo As DOCINFO) As Long

Declare Function StartPagePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long

Declare Function WritePrinter Lib "winspool.drv" (ByVal hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, pcWritten As Long) As Long

Public Function PrintRawData(ByVal sPrinter As String, ByVal sDocName As String, ByVal sData As String) As Boolean
On Error GoTo PrintErr:

          Dim lhPrinter As Long, lReturn As Long, lpcWritten As Long
          Dim lDoc As Long, sWrittenData As String
          Dim MyDocInfo As DOCINFO
          Dim pOutput As Printer
          Dim p As Printer

            For Each p In Printers
                If p.DeviceName = sPrinter Then
                    Set pOutput = p
                    GoTo StartPrinting
                End If
            Next p

            MsgBox "Unable to find the specified printer [" & sPrinter & _
            "] in the list of currently installed printers" & vbCrLf & _
            "Printing will be aborted", vbCritical
            Exit Function

StartPrinting:
          lReturn = OpenPrinter(pOutput.DeviceName, lhPrinter, 0)

          If lReturn = 0 Then
              MsgBox "Print was unsuccessful. Make sure there is a printer installed on the port you are trying to print to"
              Exit Function
          End If

          MyDocInfo.pDocName = sDocName
          MyDocInfo.pOutputFile = vbNullString
          MyDocInfo.pDatatype = vbNullString
          lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
          Call StartPagePrinter(lhPrinter)

          sWrittenData = sData

          lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, Len(sWrittenData), lpcWritten)
          lReturn = EndPagePrinter(lhPrinter) 'need this??
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)

          Exit Function

PrintErr:
    MsgBox "Print was unsuccessful. Make sure there is a printer installed on the port you are trying to print to"
    Exit Function

End Function
要使用它,您需要使用任何驱动程序(我通常使用通用/纯文本驱动程序)安装一台使用正确端口的打印机,然后按如下方式调用它,将Hello替换为要发送到打印机的数据,包括控制字符等:

PrintRawData "Generic / Text Only", "My Document", "Hello"

皮特,你有没有考虑过一种完全不同的打印机?设置、更改和发送PostSCript命令确实需要很多时间

你可能会说这是一个奇怪的解决方案,但我们的即时黑白激光DYMO打印机只需按一下按钮即可立即打印出来。他们的软件可以定制

它很快:当松开一个返回按钮时,当我的手指已经达到一厘米时,我已经在IIIIEEEUUUU上了一年,在大约5厘米的高度(释放返回键后的1秒钟),整个标签都出来了。黑白相间的阿尔贝丽特。这是一张贴纸

成本:每台100美元,包括设计和定制数据库连接的软件

我碰巧知道爱普生正在生产彩色激光即时打印机。
成本:添加几个零成本,因为它们不仅更贵,而且通常只会以大批量的形式交付,比如连锁店的车库、医院、超市等

如果您确实希望保留经验丰富的VBA技能,并更改实际导致延迟的部分,则这可能解决了速度问题。您也可以将Word打印到这台快速打印机中。

最大尺寸为:60毫米x200毫米orso

我知道,这些即时打印机使用的windows基本驱动程序和嵌入式技术少得多,使系统从打印工作中解脱出来,而且由于它们更简单,速度也更快


也许这会给你带来一个新的想法。

正如其他人所说,编程语言
#python
import sys
import Image, ImageWin
import MSWinPrint

# workaround for PIL namespace change
MSWinPrint.ImageWin = ImageWin

def print_name(name, printer_name):
    doc = MSWinPrint.document(printer_name)
    doc.begin_document('nametag for %s' % name)
    # print the name at position 20,20
    text_pos = 20, 20
    doc.text(text_pos, name)
    # add an image for this person
    img_pos = 40, 40
    img_size = 100, 100
    doc.image(img_pos, get_image(), img_size)
    doc.end_document()

def get_image():
    image_filename = 'my image.jpg'
    return Image.open(image_filename)

if __name__ == '__main__':
    name, printer_name = sys.argv[1:]
    print_name(name, printer_name)
print_tag.py Sally "EPSON Artisan 810"