如何使用 DeviceCapabilities 从 Delphi 中的特定打印机检索纸张名称和尺寸

How to use DeviceCapabilities to Retrieve the paper names and sizes from specific printer in Delphi

我一直在寻找一种方法来检索特定打印机支持的纸张及其尺寸(宽度和高度)(如果可能的话以毫米为单位)。

我看过 "Studied" 很多关于使用 Printer.GetprinterPrinter.SetPrinter 的帖子和网站,但我真的远未理解使它起作用的整个过程,我了解到我必须使用 DeviceCapabilities 才能检索特定于一台打印机的数据,但我真的不知道如何使用这些结构。我需要类似于 this 的东西,但用于特定打印机并使用 DeviceCapabilities。 我使用 Delphi VCL。

在链接的问题中,他们使用 EnumForms,我知道这是针对所有打印机的,他们还提到 DeviceCapabilities 是针对特定打印机的,这就是我需要的,以获得支持的纸张名称和尺寸,但仅适用于 selected 打印机,并非全部。 假设我 select 我的打印机: Printer.PrinterIndex:= Printer.Printers.IndexOf(MyPrinter); 我想获取该打印机支持的纸张和纸张尺寸。

非常感谢您提供的任何帮助!

这是一个示例,它为当前选定的打印机调用 DeviceCapabilities,并将 "the current default initialization values for the specified printer driver" 支持的纸张名称输出到备忘录。上一句中引用的部分来自函数的 documentation,我不确定我是否理解它的含义。发生这种情况是因为 DevMode 未通过。

procedure TForm1.Button1Click(Sender: TObject);
var
  PrinterName: string;
  HPrinter: THandle;
  Ret: DWORD;
  Buf: array of array [0..63] of Char;
  i: Integer;
begin
  PrinterName := Printer.Printers[Printer.PrinterIndex];
  if OpenPrinter(PChar(PrinterName), HPrinter, nil) then begin
    Ret := DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, nil, nil);
    if Ret > 0 then begin
      SetLength(Buf, Ret);
      DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, Pointer(Buf), nil);
      for i := 0 to Ret - 1 do
        Memo1.Lines.Add(Buf[i]);
    end;
    ClosePrinter(HPrinter);
  end;
end;

解释代码有点毫无意义,我会复制文档。我在上面包含了 link。