您需要使用Windows API函数OpenPrinter
和GetPrinter
。当致电GetPrinter
时,传递PRINTER_INFO_2
记录,将pDevMode
成员设置为DEVMODE
; DEVMODE
记录包含是否启用排序规则(除其他外)的标志。
以下是由TeamB的Dr. Peter Below撰写的Borland NG老帖子。它演示了更新打印机设置以使其成为永久性的,但它包括使用OpenPrinter
,GetPrinter
,ClosePrinter
和PRINTER_INFO_2
,以及使用DEVMODE
(在下面的代码中称为hDevMode
);它应该让你开始。
Procedure MakePrintersettingsPermanent;
var
hPrinter: THandle;
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDeviceMode: THandle;
pDevMode: PDeviceMode;
bytesNeeded: Cardinal;
pPI: PPrinterInfo2;
Defaults: TPrinterDefaults;
retval: BOOL;
begin
Assert(Printer.PrinterIndex >= 0);
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
FillChar(Defaults, Sizeof(Defaults), 0);
Defaults.DesiredAccess:=
PRINTER_ACCESS_ADMINISTER or PRINTER_ACCESS_USE;
if not WinSpool.OpenPrinter(@Device, hPrinter, @Defaults) then
RaiseLastWin32Error;
try
retval := WinSpool.GetPrinter(
hPrinter,
2,
Nil, 0, @bytesNeeded);
GetMem(pPI, bytesNeeded);
try
retval := WinSpool.GetPrinter(
hPrinter, 2,
pPI, bytesNeeded, @bytesNeeded);
If not retval Then
RaiseLastWin32Error;
pDevMode := GlobalLock(hDeviceMode);
Assert(Assigned(pdevmode));
try
Move(pdevmode^, pPI^.pDevMode^, Sizeof(pdevmode^));
finally
GlobalUnlock(hDevicemode);
end;
If not WinSpool.SetPrinter(
hPrinter, 2,
pPI,
0)
Then
RaiseLastWin32error;
finally
FreeMem(pPI);
end;
finally
WinSpool.ClosePrinter(hPrinter);
end;
end;
太棒了!太棒了! pPI.pDevMode中的dmCollate值完全是我需要查找的。永远,如果没有你,永远不会发现。非常感谢! –
很高兴我能帮到你。 :-)我记得过去几乎所有事情都需要用API来完成。 ;-) –