环境:win2000 professional/delphi7 要求:本地打印机/管理员权限登陆 ---------------------------------------------- var hP : Thandle; cReturned: DWORD; Const CustomFormName ='Self_FormName'; ....Function TryOpenPrinter :Boolean; //取得当前默认打印机句柄 var PrintName : string; pPDef : PPrinterDefaults; begin Result:=False; GetMem(pPDef,SizeOf(_PRINTER_DEFAULTSA)); pPDef^.pDatatype := nil; pPDef^.pDevMode := nil; pPDef^.DesiredAccess := PRINTER_ALL_ACCESS; PrintName := Printer.Printers[Printer.PrinterIndex]; if WinSpool.OpenPrinter(PChar(PrintName),hP,pPDef) then Result:=True; FreeMem(pPdef); end; function TryAddForm(hPrinter : THandle; FormName : string;FormSize : TPoint) : Boolean; //添加自定义CustomFormName 纸张类型 var FormInfo : TFormInfo1; pForm: Pointer; cbNeeded: DWORD; begin Result := False; pForm := nil; EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned); GetMem(pForm, cbNeeded); //取pForm的大小并分配内存 if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then begin if DeleteForm(hPrinter, PChar(CustomFormName)) then Dec(cReturned); //删除旧的Form end; FormInfo.Flags := 0; FormInfo.pName := Pchar(FormName); FormInfo.Size := TSize(FormSize); FormInfo.ImageableArea := Rect(0,0,FormSize.X,FormSize.Y); if AddForm(hPrinter,1,@FormInfo) then Result := True; end;Function TrySetPrinter:Boolean; //设置打印机 var PInfo2 : Pointer; Need : DWORD; begin result:=False; WinSpool.GetPrinter(hP,2,nil,0,@Need); if Need>0 then begin GetMem(PInfo2,Need); if WinSpool.GetPrinter(hP,2,PInfo2,Need,@Need) then begin TPrinterInfo2(PInfo2^).pDevMode.dmFields :=TPrinterInfo2(PInfo2^).pDevMode.dmFields or DM_FORMNAME or DM_PAPERSIZE; TPrinterInfo2(PInfo2^).pDevMode.dmPaperSize:=cReturned+1; if WinSpool.SetPrinter(hP,2,PInfo2,0) then result:=True; end else Result:=false; FreeMem(PInfo2); end; end;调用示范---------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); begin if Not TryOpenPrinter then Exit; if Not TryAddForm(hP,CustomFormName,Point(Width*100,Height*100)) then Exit; if Not TrySetPrinter then Exit; WinSpool.ClosePrinter(hp); end;
要求:本地打印机/管理员权限登陆
----------------------------------------------
var
hP : Thandle;
cReturned: DWORD;
Const
CustomFormName ='Self_FormName';
....Function TryOpenPrinter :Boolean; //取得当前默认打印机句柄
var
PrintName : string;
pPDef : PPrinterDefaults;
begin
Result:=False;
GetMem(pPDef,SizeOf(_PRINTER_DEFAULTSA));
pPDef^.pDatatype := nil;
pPDef^.pDevMode := nil;
pPDef^.DesiredAccess := PRINTER_ALL_ACCESS;
PrintName := Printer.Printers[Printer.PrinterIndex];
if WinSpool.OpenPrinter(PChar(PrintName),hP,pPDef) then
Result:=True;
FreeMem(pPdef);
end;
function TryAddForm(hPrinter : THandle; FormName : string;FormSize : TPoint) : Boolean; //添加自定义CustomFormName 纸张类型
var
FormInfo : TFormInfo1;
pForm: Pointer;
cbNeeded: DWORD;
begin
Result := False;
pForm := nil;
EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
GetMem(pForm, cbNeeded); //取pForm的大小并分配内存
if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
begin
if DeleteForm(hPrinter, PChar(CustomFormName)) then
Dec(cReturned); //删除旧的Form
end; FormInfo.Flags := 0;
FormInfo.pName := Pchar(FormName);
FormInfo.Size := TSize(FormSize);
FormInfo.ImageableArea := Rect(0,0,FormSize.X,FormSize.Y);
if AddForm(hPrinter,1,@FormInfo) then
Result := True;
end;Function TrySetPrinter:Boolean; //设置打印机
var
PInfo2 : Pointer;
Need : DWORD;
begin
result:=False;
WinSpool.GetPrinter(hP,2,nil,0,@Need);
if Need>0 then
begin
GetMem(PInfo2,Need);
if WinSpool.GetPrinter(hP,2,PInfo2,Need,@Need) then
begin TPrinterInfo2(PInfo2^).pDevMode.dmFields :=TPrinterInfo2(PInfo2^).pDevMode.dmFields or DM_FORMNAME or DM_PAPERSIZE;
TPrinterInfo2(PInfo2^).pDevMode.dmPaperSize:=cReturned+1;
if WinSpool.SetPrinter(hP,2,PInfo2,0) then
result:=True;
end else
Result:=false;
FreeMem(PInfo2);
end;
end;调用示范----------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
if Not TryOpenPrinter then Exit;
if Not TryAddForm(hP,CustomFormName,Point(Width*100,Height*100)) then Exit;
if Not TrySetPrinter then Exit;
WinSpool.ClosePrinter(hp);
end;