现需自动更改打印的打印首选项,将纸张类别变更,但根据网上的资料总不能解决?//isize:=DMPAPER_A3;procedure changeSize(isize:integer);
var   
    Device: array[0..cchDeviceName - 1] of char;
    Driver: array[0..MAX_PATH - 1] of char;
    Port:   array[0..MAX_PATH - 1] of char;
    hDMode: THandle;
    PDMode: PDEVMODE;
    s:array [0..64] of char;
begin
    Printer.GetPrinter(Device,Driver,Port,hDMode);
    if hDMode <> 0 then begin
        pDMode:=GlobalLock(hDMode);
        if pDMode <> nil then begin
            pDMode^.dmPaperSize:=iSize;
            pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
            Printer.SetPrinter(Device,Driver,Port,hDMode);
            GlobalUnlock(hDMode);
            strcopy(s,'windows');
            //sendmessage(hwnd_broadcast,wm_settingchange,0,longint(@s));
        end;
    end;
end;
在执行程序后,打印机的打印首选项没有变动,急啊!

解决方案 »

  1.   

    我给你一个我的实际应用,包你满意,不满意可以扣我100分  TPublic = class
      private
      protected
      public
        class procedure SetDefaultPrinter(PrinterName: String);
        class procedure SetPaperSize(PaperSize, PaperLength, PaperWidth: Integer);
      end;  class procedure TPublic.SetDefaultPrinter(PrinterName: String);
    var
      j: Integer;
      Device : PChar;
      Driver : Pchar;
      Port : Pchar;
      HdeviceMode: Thandle;
      aPrinter : TPrinter;
    begin
       Printer.PrinterIndex := -1;
       getmem(Device, 255) ;
       getmem(Driver, 255) ;
       getmem(Port, 255) ;
       aPrinter := TPrinter.create;
       for j := 0 to Printer.printers.Count-1 do
       begin
         if Printer.printers[j] = PrinterName then
         begin
           aprinter.printerindex := j;
           aPrinter.getprinter(device, driver, port, HdeviceMode) ;
           StrCat(Device, ',') ;
           StrCat(Device, Driver ) ;
           StrCat(Device, Port ) ;
           WriteProfileString('windows', 'device', Device) ;
           StrCopy( Device, 'windows' ) ;
           SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0 , Longint(@Device)) ;
         end;
       end;
       Freemem(Device, 255) ;
       Freemem(Driver, 255) ;
       Freemem(Port, 255) ;
       aPrinter.Free;
    end;class procedure TPublic.SetPaperSize(PaperSize, PaperLength,
      PaperWidth: Integer);
    var
      Device : array[0..cchDeviceName -1] of Char;
      Driver : array[0..(MAX_PATH -1)] of Char;
      Port : array[0..32]of Char;
      hDMode : THandle;
      pDMode : PDevMode;
    begin
      Printer.GetPrinter(Device,Driver,Port,hDMode);
      if hDMode <> 0 then
      begin
        pDMode := GlobalLock(hDMode);
        if pDMode <> nil then
        begin
          pDMode^.dmPaperSize := PaperSize;
          pDMode^.dmPaperLength := PaperLength;
          pDMode^.dmPaperWidth := PaperWidth;
          pDMode^.dmFields := pDMode^.dmFields or
          DM_PAPERSIZE;
          pDMode^.dmFields :=
          pDMode^.dmFields or DM_PAPERLENGTH;
          pDMode^.dmFields :=
          pDMode^.dmFields or DM_PAPERWIDTH;
          ResetDC(Printer.Handle,pDMode^);
          GlobalUnlock(hDMode);
        end;
      end;
    end;......实际调用TPublic.SetDefaultPrinter('EPSON LQ300K+');TPublic.SetPaperSize(256, 635, 1450);//注意256这个值表示自定义纸张
      

  2.   

    还是没有成功我要在DELPHI里打印PDF文档,导入PDF.OCX后,updf.loadfile('a.pdf');updf.print()不能正常使用,不知道是何原因。于是我使用ShellExecute(Handle, 'print', PChar('d:\1.pdf'),'','',SW_show);可以打印,但是不能调整打印机的纸张类型
      

  3.   

    TPublic.SetDefaultPrinter('EPSON LQ300K+');//注意打印机名称的大小写
    TPublic.SetPaperSize(256, 635, 1450);//注意256这个值表示自定义纸张上面2个肯定是没有问题的。(久经沙场了的)Pdf.LoadFile('sigid.pdf');
    Pdf.print;在我这里测试没有任何问题。 你试试打印一下其他的文件,再查查原因
      

  4.   

    Pdf.LoadFile('sigid.pdf');
    Pdf.print;
    我可以成功打印,但不能设置纸张类型,printwithdialog可以,但会出现对话框
    pdf.print在打印之前能设置纸张类型就成事OK了我使用的是奥西的S320绘图仪
      

  5.   

    如果不执行TPublic.SetDefaultPrinter('EPSON LQ300K+');面直接运行TPublic.SetPaperSize(256, 635, 1450);可以吗,因为我只有一个打印机,不需要再设置defalutprint吧
      

  6.   

    //如果不执行TPublic.SetDefaultPrinter('EPSON LQ300K+');面直接运行TPublic.SetPaperSize
    //(256, 635, 1450);可以吗,因为我只有一个打印机,不需要再设置defalutprint吧
    可以的。