Delphi中获取打印机设备名和端口名usesPrinters;{$IFNDEFWIN32}constMAX_PATH=144;{$ENDIF}procedureTForm1.Button1Click(Sender:TObject);varpDevice:pChar;pDriver:pChar;pPort:pChar;hDMode:THandle;beginifPrintDialog1.ExecutethenbeginGetMem(pDevice,cchDeviceName);GetMem(pDriver,MAX_PATH);GetMem(pPort,MAX_PATH);Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);iflStrLen(pDriver)=0thenbeginGetProfileString('Devices',pDevice,'',pDriver,MAX_PATH);pDriver[pos(',',pDriver)-1]:=#0;end;iflStrLen(pPort)=0thenbeginGetProfileString('Devices',pDevice,'',pPort,MAX_PATH);lStrCpy(pPort,@pPort[lStrLen(pPort)+2]);end;Memo1.Lines.Add('Device:='+StrPas(pDevice));Memo1.Lines.Add('Driver:='+StrPas(pDriver));Memo1.Lines.Add('Port:='+StrPas(pPort));FreeMem(pDevice,cchDeviceName);FreeMem(pDriver,MAX_PATH);FreeMem(pPort,MAX_PATH);end;end;Api函数列表--与打印相关Api函数名函数说明适用范围W3.xW95NTAddPrinterConnection为当前用户建立与打印机的联系否是是StartPagePrinter开始打印机否是是StartDoc开始打印作业是是是StartDocPrinter开始打印作业否是是AddPrintProvidor加入一个打印机支持器否是是AddForm加入一个打印机窗体否是是AddPort加入一个打印机端口否是是AddMonitor加入一个打印机管理器否是是ShellExecute打开或打印指定文件否是是ClosePrinter关闭打开的打印机否是是WritePrinter向打印机输出数据否是是AddPrinter在打印机服务器上建立一个打印机否是是SetAbortProc设备打印作业的放弃函数否是是SetPrinter设置打印机信息否是是SetPrinterData设置打印机配置否是是SetJob设置打印作业信息否是是ResetPrinter设置打印数据类型和设备模式值否是是DeletePrinterConnection删除与打印机的连接否是是DeletePrintProcessor删除打印机处理器否是是DeletePrinterDriver删除打印机驱动程序否是是DeletePrinter删除打印机服务器上的打印机否是是DeleteMonitor删除打印机监视器否是是DeletePrintProvidor删除打印机提供者否是是DeleteForm删除打印机窗体层差否是是AbortPrinter删除打印机缓冲文件否是是DeletePort删除打印机端口否是是AddJob启动一个打印作业否是是AdvancedDocumentProperties进行打印机高级设置否是是PrintDlg建立打印文本对话框否是是EnumPrintProcessors枚举已安装的打印机处理器否是是EnumPrinterDrivers枚举已安装的打印机驱动程序否是是EnumPorts枚举可用打印机端口否是是EnumPrintProcessorDatatypes枚举打印机所支持的数据类型否是是EnumForms枚举所支持的打印机窗体否是是AbortDoc终止一项打印作业是是是PrinterProperties修改打印机属性否是是AddPrintProcessor将打印处理器复制到打印机服务器中否是是AddPrinterDriver将打印机驱动程序复制到打印机服务器中否是是PrinterMessageBox显示打印作业出错信息否是是ConnectToPrinterDlg显示浏览对话并连接网络打印机否是是EndPagePrinter结束打印页否是是EndDoc结束打印作业是是是EndDocPrinter结束打印作业否是是StartPage准备打印机接收数据是是是WaitForPrinterChange监测打印机或打印机服务器变化否是是GetPrintProcessorDirectory获取打印机驱动处理器路径否是是GetPrinterDriver获取打印机驱动程序信息否是是GetPrinterDriverDirectory获取打印机驱动程序路径否是是GetPrinter获取打印机信息否是是GetPrinterData获取打印机配置信息否是是GetForm获取打印机窗口信息否是是EnumJobs获取打印作业信息否是是GetJob获取打印作业信息否是是OpenPrinter获取指定打印机的句柄否是是ReadPrinter读打印机数据否是是DocumentProperties配置打印机设置否是是ConfigurePort配置打印机端口否是是用Delphi编写打印程序的窍门如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。1.获娶显示当前打印机的分辨率Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道打印机的分辨率,请在程序中加入一行:ShowMessage(′水平分辨率′+inttostr(GetDeviceCaps(printerHandle,LOGPIXELSX))+chr(13)+′垂直分辨率:′+inttostr(GetDeviceCaps(printerHandle,LOGPIXELSY)));结果就一目了然了。2.将结果直接送到打印机Delphi提供了两种打印方式:一是将结果输送到Form,再调用Form的print方法将结果输送到打印机,二是将结果直接输送到打印机。如果你采用第一种方式,则无论你怎样调整Form的PrintScal属性,打印出来的东西也不会让你满意。因此建议采用第二种方式。3.尽量不要使用AssignPrn尽管AssignPrn简化了文本打印操作,使输出到打印机像输出到文件一样简单。但简单带来的是一系列的不方便:你无法知道当前打印的行数,无法准确控制行距,无法灵活改变字体字形等等。还是用打印机的Canvas属性进行打印吧。4.用打印机的点数做度量单位如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printerCanvasrectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出06英寸宽、12英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。具体做法如下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printerHandle,LOGPIXELSX);PointY:=GetDeviceCaps(printerHandle,LOGPIXELSX);printerCanvasrectangle(0,0,PointX*1,PointY*2)这样,无论你使用什么样的打印机,都能得到一个1英寸宽、2英寸高的矩形。5.添加打印程序单元尽管Delphi在生成窗体时会自动在USES部分加入许多程序单元,但打印程序单元(Printers)却不在之列,要想使打印机正常工作和程序不出错,你还是老老实实手工给它加上吧。以下是来自Borland公司的完整例子。请注意其中两条判断语句,这说明有时候仅仅凭getprinters并不能保证信息的正确,还需要WIN.INI的帮助。usesprinters;{$IFNDEFWIN32}constMAX_PATH=144;{ENDIF}procedureTForm1.Button1Click(Sender:TObject);varpDevice:pChar;pDriver:pChar;pPort:pChar;hDMode:THandle;beginifPrintDialog1.ExecutethenbeginGetMem(pDevice,cchDeviceName);GetMem(pDriver,MAX_PATH);GetMem(pPort,MAX_PATH);Printer.GetPrinter(pDevice,pDriver,pPort,hDMode);iflStrLen(pDriver)=0thenbeginGetProfileString('Devices',pDevice,'',pDriver,MAX_PATH);pDriver[pos(',',pDriver)-1]:=#0;end;iflStrLen(pPort)=0thenbeginGetProfileString('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;·获取打印机队列的状态信息:在有些情况下,需要获取打印机队列的状态信息,可以通过WindowsAPI函数ENumJobs来获取打印机队列的状态信息。下面的程序片断对获取打印机队列的状态信息进行了说明。(1)创建一个新工程;(2)在窗体Form1中添加一个Button组件和一个Memo组件,进行相关属性的设置;(3)添加Button1的OnClick事件。procedureTForm1.Button1Click(Sender:TObject);varLPHandle:THandle;//打印机句柄LPStrBuf:Array[0..256]ofChar;//打印机名称NoJobs:Word;//希望获取的作业数s:LongWord;//Job_Info的字节数Job_Info:Array[0..10]ofJOB_INFO_1;//打印队列信息cbNeeded:Cardinal;cReturned:Cardinal;//返回的作业数ret:LongBool;I:integer;beginLPStrBuf:='HPLaserJet';//指定打印机名//打开打印机ifOpenPrinter()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)+'个。');forI:=0tocReturned-1doMemo1.Lines.Add('第'+IntToStr(I+1)+'个打印任务有'+IntToStr(Job_Info[I].TotalPages)+'页。');end;在进行测试的时候,应根据系统中安装的打印机设置LPStrBuf的