3

我需要捕获 Windows 机器已设置的打印机驱动程序设置,以确定它们是否已为特定打印机打开分页。

我知道如何使用传入 DC_COLLATE 的 DeviceCapabilities 调用来获取打印机是否可以进行校对,但这并不能告诉我打印驱动程序是否设置为校对,只是打印机具有校对能力,而不是它校对。

为什么?

我正在尝试使用 Delphi XE2 解决 QuickReports 中的一个问题,我们的程序不再像在 Delphi 6 下编译时那样工作。对于 Delphi 6 版本,无论 QuickReport 的设置如何,它总是遵守打印机驱动程序中的整理设置. 对于 Delphi XE2 版本,它不会。

用户没有安全性来更改分页设置,系统管理员强制他们启用,并且这些文档需要在指定的打印机上打印分页。

如果我可以确定驱动程序是否设置为始终进行整理,我可以强制在 QuickReport 中进行整理设置,它会执行我需要的操作,从而解决我上面的问题。

一如既往,我很欣赏任何想法。

干杯!

4

1 回答 1

4

您需要使用 Windows API 函数OpenPrinterGetPrinter. 调用时GetPrinter,传递一条PRINTER_INFO_2记录,该记录将返回,pDevMode成员设置为a DEVMODE;该DEVMODE记录包含是否启用排序规则的标志(除其他外)。

这是 TeamB 的 Peter 下面的旧 Borland NG 帖子。它演示了更新打印机设置以使其永久化,但它包括使用OpenPrinterGetPrinterClosePrinterPRINTER_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;
于 2013-01-21T22:08:40.723 回答