由於程序必須能夠在Windows XP上打印,因此我無法使用XPS API。如何使用WinSpool API設置紙張大小?
我試圖使用WinSpool從Letter設置紙張大小爲A4。
這是我的測試代碼:
var
H : THandle;
I : TBytes;
Info : PPrinterInfo2;
NeededSize : DWORD;
DevMode : PDeviceMode;
PD : TPrinterDefaults;
begin
PD.pDatatype := nil;
PD.pDevMode := nil;
PD.DesiredAccess := PRINTER_ACCESS_ADMINISTER;
if not OpenPrinter('Brother HL-5350DN series Printer', H, @PD) then begin
raise Exception.Create('OpenPrinter error: ' + SysErrorMessage(GetLastError));
end;
try
Assert(not GetPrinter(H, 2, nil, 0, @NeededSize));
SetLength(I, NeededSize);
Info := @I[0];
if not GetPrinter(H, 2, Info, NeededSize, @NeededSize) then begin
raise Exception.Create('GetPrinter error: ' + SysErrorMessage(GetLastError));
end;
DevMode := Info.pDevMode;
DevMode.dmFields := DevMode.dmFields or DM_PAPERSIZE;
DevMode.dmPaperSize := DMPAPER_A4;
Info.pSecurityDescriptor := nil; // According to MSDN it has to be niled if we're not going to change it.
if not SetPrinter(H, 2, Info, 0) then begin
raise Exception.Create('SetPrinter error: ' + SysErrorMessage(GetLastError));
end;
finally
ClosePrinter(H);
end;
TPrintDialog.Create(Self).Execute; // This is just so I can check the paper size
end;
我有關於訪問權限兩個問題。
如果我設置PD.DesiredAccess
到PRINTER_ACCESS_ADMINISTER
的GetPrinter
調用失敗,我想這是由於UAC。
如果我將它設置爲PRINTER_ACCESS_USE
GetPrinter
調用成功,Info結構正常,但對SetPrinter
的調用失敗。
有趣的是,當我忽略SetPrinter
的結果時,即使SetPrinter
失敗,打印對話框也會將A4報告爲打印機大小。
我在做它完全錯誤,它足以將PDeviceMode正確設置爲OpenPrinter? (其實我寫這個問題:-)
另一個問題是關於VCL後本想出了:
如果我使用Printers
單元我怎麼知道緩衝區有多大,必須是那些獲得作爲參數傳遞到TPrinter.GetPrinter
方法?
背景:
該系統:Windows 7專業版64位英語與英語語言環境。
我試圖在網絡打印機(Brother HL-5350DN)上打印到A4紙。
我已將控制面板中的所有打印機設置設置爲A4紙,但我正在編寫的Delphi 2009程序仍獲取US Letter的紙張尺寸。
換句話說:Delphi程序不考慮打印機假脫機程序的默認設置。
如果我先運行一個TPrinterDialog並從那裏手動選擇正確的紙張尺寸(在高級打印機設置中),一切都很好。
該程序必須運行沒有任何用戶界面,所以我必須以編程方式解決此問題,或者最好該程序應該只是尊重默認的Windows打印機後臺處理程序設置。
也許我錯過了一些重要的設置?
爲什麼你不能使用TPrinter工作? –
@大衛:有一個在TPrinter沒有的PageFormat設置,我可以看到的唯一方法是使用TPrinter.GetPrinter和TPrinter.SetPrinter。我如何知道爲TPrinter.GetPrinter的參數分配了多少空間? –
你究竟想在這裏做什麼?打印機當然知道紙張的大小。用戶從打印機首選項對話框中選擇他們想要的紙盒。您無法更改代碼中的紙張尺寸!如果您將整個故事告訴我們,而不是僅僅爲您的問題的一個小角落提供一個窗口,它可能會對我們有所幫助。 –