当前位置:文档之家› 打印机编程

打印机编程

打印机编程1、检测当前打印机状态用内嵌汇编调用中断INT 17H,读取打印机的状态字节加以分析,即可得到其当前状态.例:输入参数:如果有3个打印端口LPT1、LPT2、LPT3,那么输入参数LPTPort就是1、2、3。

function TestPrinterStatus(LPTPort : word):byte;var status : byte;CheckLPT : word;beginstatus := 0;if (LPTPort >=1) and (LPTPort <=3) thenbeginCheckLPT := LPTPort -1;asmmov dx,CheckLPT;mov al,0;mov ah,2;int 17H;mov &status,ah;end;end;result := status;end;返回值有以下几种:01H:超时08H:I/O错误10H:打印机未联机20H:打印机缺纸80H:打印机空闲。

2、如何获取当前打印机的名称、驱动程序、打印端口信息:以下是来自Borland公司的完整例子。

请注意其中两条判断语句,这说明有时候仅仅凭getprinters并不能保证信息的正确,还需要WIN.INI的帮助。

uses printers;{$IFNDEF WIN32}const MAX_PATH = 144;{ENDIF}procedure TForm1.Button1Click(Sender : TObject);varpDevice : pChar;pDriver : pChar;pPort : pChar;hDMode : THandle;beginif PrintDialog1.Execute then beginGetMem(pDevice,cchDeviceName);GetMem(pDriver,MAX_PATH);GetMem(pPort,MAX_PATH);Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);if lStrLen(pDriver) = 0 then beginGetProfileString('Devices',pDevice,'',pDriver,MAX_PATH);pDriver[pos(',',pDriver) - 1] := #0;end;if lStrLen(pPort) = 0 then beginGetProfileString('Devices',pDevice,'',pPort,MAX_PATH);lStrCpy(pPort,@pPort[lStrLen(pPort) + 2]);end;FreeMem(pDevice,cchDeviceName);FreeMem(pDriver,MAX_PATH);FreeMem(pPort,MAX_PATH);end;end;3、获取打印机队列的状态信息:在有些情况下,需要获取打印机队列的状态信息,可以通过WindowsAPI函数ENumJobs来获取打印机队列的状态信息。

下面的程序片断对获取打印机队列的状态信息进行了说明。

(1)创建一个新工程;(2)在窗体Form1中添加一个Button组件和一个Memo组件,进行相关属性的设置;(3)添加Button1的OnClick事件。

procedure TForm1.Button1Click(Sender :TObject);varLPHandle : THandle;//打印机句柄LPStrBuf : Array [0..256] of Char;//打印机名称NoJobs : Word; //希望获取的作业数s : LongWord; //Job_Info的字节数Job_Info : Array [0..10] of JOB_INFO_1; //打印队列信息cbNeeded : Cardinal;cReturned : Cardinal; //返回的作业数ret : LongBool;I : integer;beginLPStrBuf := 'HPLaserJet';//指定打印机名//打开打印机if OpenPrinter() thenbeginMessageBox(Form1.Handle,'打开打印机失败。

','信息',MB_OK);Exit;end;s := SizeOf(Job_Info);cbNeeded := 0;cReturned := 0;NoJobs := 10;ret := ENumJobs(LPHandle,0,NoJobs,1,@Job_Info,s,cbNeeded,cReturn);//显示打印队列信息Memo1.Lines.Add('共有打印任务:' + InttoStr(cReturned) + '个。

');for I := 0 to cReturned -1 doMemo1.Lines.Add('第' + IntToStr(I+1) + '个打印任务有' + IntToStr(Job_Info[I].TotalPages) + '页。

'); end;在进行测试的时候,应根据系统中安装的打印机设置LPStrBuf的数值,可以通过Windows 系统的“控制面板”打开打印机管理器验证运行结果。

4、获取默认打印机的信息:在Windows的Win.ini文件中有下面的一些配置信息:[Windows]load =run =NullPort = Nonedevice = HPLaserJetIII,HPPCL5MS,LPT1.............其中Windows节的device键中指明了当前系统中默认打印机的信息。

可以通过WindowsAPI 函数GetProfileString获取该信息。

函数GetProfileString的原形如下:DWORDGetProfileString(LPCTSTRlpAppName, //指定节名的字符串LPCTSTRlpKeyName, //指定键名的字符串LPCTSTRlpDefault, //没有找到键名时返回的字符串LPTSTRlpReturnedString, //在键名找到时返回的字符串DWORDnSize //lpReturnedString的字节数);例子如下:(1)创建一个新的工程;(2)在窗体Form1上添加一个Button组件和一个Edit组件,进行相关属性设置;(3)添加Button1的OnClick事件。

procedure TForm1.Button1Click(Sender : TObject);varAppName : Array [0..256] of Char; //节名称字符串KeyName : Array [0..256] of Char; //键名称字符串DefaultString : Array [0..256] of Char; //在键名没找到时默认返回的字串ReturnedString : Array [0..256] of Char; //在键名找到时返回的字串beginAppName := 'Windows';//节名称KeyName := 'device'; //键名称GetProfileString(AppName,KeyName,DefaultString,ReturnedString,Sizeof(ReturnedString));Edit1.Text := ReturnedString;//显示结果end;以上测试可打开win.ini进行对照。

2004-3-3 12:24:52 打印机的设置5、Windows系统默认的打印机信息存放于Win.INI文件中,只有修改了相应的文件内容,再通知Windows系统进行刷新,才算改变了默认的打印机。

下面是程序片断:varstrINI : Array [0..MAX_PATH] of Char;arrWindows : Array [0..46] of Char;beginGetWindowsDirectory(strINI,SizeOf(strINI));StrCat(strINI,'Win.INI');with TINIFile.Create(strINI) dotry //更改WIN.INI文件中的默认打印机设置WriteString('Windows','device','HPLaserJet 4 Plus,HPPCL5MS,LPT1');finallyFree;end;StrCopy(arrWindows,'Windows');SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(@arrWindows)); //发消息end;6、调用系统的“页面设置”对话框:首先要在Uses子句中加入CommDlg单元,参见下例:procedure TForm1.Button1Click(Sender : TObject);var s : tagPSD;beginFillChar(s,Sizeof(s),0);s.lStructSize := Sizeof(s);if PageSetupDlg(s) thenShowmessage('OK')elseShowmessage('Error');end;7、调用系统的“添加打印机”对话框:ShellExecute(0,'Open','rundll','shell32.dll,SHHelpShortcuts_RunDLL AddPrinter', '' , SW_SHOWNORMAL);打印测试页:WinExec('rundll32 msprint2.dll,RUNDLL_PrintTestPage',1);8、用代码添加打印机:需要调用API函数的AddPrinter,它有三个参数:打印机名、打印质量、打印机说明。

以下代码把函数封装起来。

只需要提供出现在Windows中的打印机名,打印机的接口名(例如:LPT1:),驱动器名和打印程序名(通常是winprint)。

相关主题