开发收银系统时因为客户在使用驱动连接票据打印机, 但是又要开钱箱, 驱动里只能每张单据都开钱箱, 但是软件要求只有在结账时才开钱箱,
所以就需要用软件控制打印机开钱箱。
票据打印机一般都支持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;