我的应用程序如何知道是否存在默认的打印机更改通知

时间:2013-04-24 08:22:18

标签: delphi delphi-xe3 printers

我正在使用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.

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

  1. CutePDF Writer(默认打印机)
  2. 我的传真
  3. Microsoft XPS文档编写器
  4. 当我运行示例应用程序并单击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。

2 个答案:

答案 0 :(得分:2)

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

不幸的是,WM_SETTINGCHANGE不包含任何允许您确定默认打印机是否已更改的信息。您无法知道特定WM_SETTINGCHANGE消息是否指示默认打印机的更改或指示某些其他设置的更改。

但是,我会质疑您的信念,即您应该回复此消息。请考虑以下情形:

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

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

答案 1 :(得分:-1)

只需添加:Printer.Refresh;

像这样:

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