我正在使用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台打印机:
当我运行示例应用程序并单击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。
答案 0 :(得分:2)
您可以收听WM_SETTINGCHANGE
通知消息。 MSDN文档有点稀疏,但SetDefaultPrinter
文档中的示例代码清楚地表明,修改默认打印机的任何一方都应该广播WM_SETTINGCHANGE
消息。
不幸的是,WM_SETTINGCHANGE
不包含任何允许您确定默认打印机是否已更改的信息。您无法知道特定WM_SETTINGCHANGE
消息是否指示默认打印机的更改或指示某些其他设置的更改。
但是,我会质疑您的信念,即您应该回复此消息。请考虑以下情形:
事情是应用程序有历史。用户最后一次打印时明确选择了打印机A.为什么更改默认打印机意味着下次应用程序应该提供新的默认打印机而不是用户选择使用的最后一台打印机?
答案 1 :(得分:-1)
只需添加:Printer.Refresh;
像这样:
procedure TForm1.Button1Click(Sender: TObject);
begin
Printer.Refresh;
ShowMessage(Printer.Printers[Printer.PrinterIndex]);
end;