0

我正在使用 Delphi XE3,下面是我的示例应用程序:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses Vcl.Printers;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Printer.Printers[Printer.PrinterIndex]);
end;

end.

窗下| 控制面板 | 设备和打印机,有 3 台打印机:

  1. CutePDF Writer(默认打印机)
  2. 我的传真
  3. Microsoft XPS 文档编写器

当我运行示例应用程序并单击 Button1 时,它显示“CutePDF Writer”作为默认打印机。在不关闭示例应用程序的情况下,我转到 Windows | 控制面板 | 设备和打印机将“我的传真”设置为默认打印机,然后我返回示例应用程序并再次单击 Button1,它仍然显示“CutePDF Writer”作为默认打印机(它应该显示“我的传真”)。在学习了单元 Vcl.Printers 中的 TPrinter 类之后,我可以编写如下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Printer.Printing then
    Printer.PrinterIndex := -1;
  ShowMessage(Printer.Printers[Printer.PrinterIndex]);
end;

对于每次需要将 PrinterIndex 设置为 -1 来说,这不是一个好方法。我的问题是我的应用程序如何知道是否有默认打印机更改通知?因此,如果有默认打印机更改通知,我只会将 PrinterIndex 设置为 -1。

4

2 回答 2

2

您可以收听WM_SETTINGCHANGE通知消息。MSDN 文档有点稀疏,但是文档中的示例代码SetDefaultPrinter清楚地表明WM_SETTINGCHANGE,修改默认打印机的任何一方都应该广播一条消息。

遗憾的是,其中WM_SETTINGCHANGE不包含任何可让您确定默认打印机是否已更改的信息。您无法知道特定WM_SETTINGCHANGE消息是表示更改了默认打印机还是表示更改了某些其他设置。

但是,我会质疑您认为您应该回应此消息的信念。考虑以下场景:

  • 您有一台带有两台打印机 A 和 B 的机器。
  • 打印机 A 是默认打印机。
  • 应用程序启动。
  • 用户打印,但选择打印机 B。
  • 用户再次打印。程序记得上一次用户想要打印机 B。但是这次用户想要打印机 A,因此更改了该打印机。
  • 然后用户在控制面板中将默认打印机更改为打印机 B。
  • 用户再次打印。应该向用户提供哪种打印机?

问题是应用程序有历史。用户上次打印时,他们明确选择了打印机 A。为什么更改默认打印机意味着下一轮应用程序应该提供新的默认打印机,而不是用户选择使用的最后一台打印机?

于 2013-04-24T09:02:52.800 回答
-1

只需添加:Printer.Refresh;

像这样 :

procedure TForm1.Button1Click(Sender: TObject); begin Printer.Refresh; ShowMessage(Printer.Printers[Printer.PrinterIndex]); end;

于 2013-11-12T11:50:06.713 回答