如何使用 DeviceCapabilities 从 Delphi 中的特定打印机检索纸张名称和尺寸
How to use DeviceCapabilities to Retrieve the paper names and sizes from specific printer in Delphi
我一直在寻找一种方法来检索特定打印机支持的纸张及其尺寸(宽度和高度)(如果可能的话以毫米为单位)。
我看过 "Studied" 很多关于使用 Printer.Getprinter
和 Printer.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。
我一直在寻找一种方法来检索特定打印机支持的纸张及其尺寸(宽度和高度)(如果可能的话以毫米为单位)。
我看过 "Studied" 很多关于使用 Printer.Getprinter
和 Printer.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。