通过驱动向打印机发送一段(ESC)控制指令
2013-10-25 10:32
232 查看
这个功能看起来挺奇葩的, 写这个是因为有客户在使用驱动连接票据打印机, 但是又要开钱箱, 驱动里只能每张单据都开钱箱, 而这个打印机又不是只打印结帐单
所以就需要用软件控制打印机开钱箱
票据打印机一般都支持ESC/POS指令, 所以就出现了如下代码, 通过这个函数可以吧ESC/POS指令里的开钱箱指令发送给打印机控制开钱箱
同样, 也可以发送别的什么东西, 比如响响蜂鸣器之类的
哦 补充下, 这个代码里使用的是默认打印机, 当然稍微改动下, 就可以先弹出个打印机列表, 然后选择打印机传进去, 这样就可以控制任意打印机了
附: 获取驱动打印机状态:
所以就需要用软件控制打印机开钱箱
票据打印机一般都支持ESC/POS指令, 所以就出现了如下代码, 通过这个函数可以吧ESC/POS指令里的开钱箱指令发送给打印机控制开钱箱
同样, 也可以发送别的什么东西, 比如响响蜂鸣器之类的
哦 补充下, 这个代码里使用的是默认打印机, 当然稍微改动下, 就可以先弹出个打印机列表, 然后选择打印机传进去, 这样就可以控制任意打印机了
OpenPrinter(PChar(Printer.Printers[0]), nD, nPPD);
uses WinSpool, Printers; function WritePrtDataForDriver(AData: string; var AErrCode: Byte): Boolean; var nD: Cardinal; nPPD: PPrinterDefaults; nDocInfo: DOC_INFO_1; nDataLength: DWORD; nSize: DWORD; nReturn: Boolean; begin Result := False; AErrCode := 1; nD := INVALID_HANDLE_VALUE; nPPD := New(PPrinterDefaults); try with nPPD^ do begin DesiredAccess := PRINTER_ACCESS_USE; pDatatype := nil; pDevMode := nil; end; OpenPrinter(PChar(Printer.Printers[0]), nD, nPPD); finally Dispose(nPPD); end; if nD = INVALID_HANDLE_VALUE then Exit; with nDocInfo do begin pDocName := 'Print Document'; pOutputFile := nil; pDatatype := 'RAW'; end; AErrCode := 2; if StartDocPrinter(nD, 1, @nDocInfo) <= 0 then Exit; AErrCode := 3; if not StartPagePrinter(nD) then Exit; AErrCode := 4; nDataLength := Length(AData); nReturn := WritePrinter(nD, PChar(AData), nDataLength, nSize); if (not nReturn) or (nSize <> nDataLength) then Exit; AErrCode := 5; if not EndPagePrinter(nD) then Exit; AErrCode := 6; if not EndDocPrinter(nD) then Exit; AErrCode := 7; if not ClosePrinter(nD) then Exit; AErrCode := 0; Result := True; end;
附: 获取驱动打印机状态:
var i: Integer; nPRH: THandle; PrinterName:String; nBuff: array[0..8192] of Char; nSize: DWord; pInfo: PPrinterInfo2; begin Memo1.Lines.Clear; for i := 0 to Printer.Printers.Count - 1 do begin if OpenPrinter(PChar(Printer.Printers[i]), nPRH,nil) then begin if GetPrinter(nPRH, 2, @nBuff, SizeOf(nBuff), @nSize) then begin pInfo:=PPrinterInfo2(@nBuff); Memo1.Lines.Add('Device := ' + Printer.Printers[i]); Memo1.Lines.Add('Status := ' + inttostr(pInfo.Status)); Memo1.Lines.Add(''); end; end; ClosePrinter(nPRH); end; end;
相关文章推荐
- C#通过LPT控制打印机——txt文档读取指令打印条码
- 如何通过使用 VisualC # .NET /VB.NET 向打印机发送数据/控制命令
- 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
- 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
- C#使用ESC指令控制POS打印机打印小票
- 【转】C#使用ESC指令控制POS打印机打印小票
- 3.3 使用STC89C52控制MC20通过GPRS远程发送数据
- 用虚拟并口解决向USB条码打印机发送ZPL指令的解决方案
- 使用SG_IO发送SCSI 指令测试底层驱动的scatter-gather 功能
- delphi7 ide扩展,类似vc6,通过编译指令控制多项目工程编译输出
- EPSON ESC/POS打印机指令
- 通过ESP8266手机或电脑浏览器网页能控制远程任意组任意路继电器开关并收发单片机指令 测试OK
- python向打印机发送数据(1)-- 驱动方式
- 【安卓笔记】通过发送特定的短信远程控制手机
- C# 网络打印机ESC指令打印小票
- 基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机
- 【安卓笔记】通过发送特定的短信远程控制手机
- 通过手机的蓝牙向支持蓝牙接口的打印机发送数据打印问题
- android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等
- 通过打印机的ip安装打印机的驱动