16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"通常使うプリンタに設定する"
この発言に対し以下のコメントが寄せられています
#00791 Kazz さん RE:通常使うプリンタに設定する
◆解説
指定のプリンタを「通常使うプリンタ」に設定します。
また、プリンタドライバに対して、用紙サイズや用紙の向き等の
設定を恒久的に行うことも可能です。
◆動作確認
Delphi3.1 + Win95a
#WinNTでも動作すると思いますが...
#もしかしたらセキュリティの関係で動作しない場合があるかも?(^^;
◆実際のコード
uses に Printers, WinSpool が必要です。
----- ここから -----
//
//指定のプリンタを「通常使うプリンタ」に設定する
//
// Entry PrinterName: プリンタ名
// DefautFlag : True [通常使うプリンタ]に設定する
// False 〃 設定しない
// DevMode : DEVMODE構造体
// プリンタドライバに恒久的に設定される
//
// [通常使うプリンタ]に設定する処理のみ行う場合には、
// DefautFlag = True, DevMode = nil を指定する
//
//例1 「通常使うプリンタ」に設定し、DEVMODE構造体も設定する
// SetDefaultUsePrinter(PrinterName, True, DevMode);
//
//例2 「通常使うプリンタ」に設定するのみ
// SetDefaultUsePrinter(PrinterName, True, nil);
//
//例3 DEVMODE構造体を設定し「通常使うプリンタ」は変更しない
// SetDefaultUsePrinter(PrinterName, False, DevMode);
//
//※WinAPIコールに失敗した場合には、例外が発生する点に注意
//
procedure SetDefaultUsePrinter(PrinterName: String;
DefaultFlag: Boolean; DevMode: PDeviceMode);
var
hPrinter: THandle;
PDefaults: TPrinterDefaults;
Needed: DWORD;
pInfo: PPrinterInfo2;
procedure SetDefaultUsePrinterNT;
var
pDrvInfo: PDriverInfo2;
DefaultPrinter,Driver: String;
begin
GetPrinterDriver(hPrinter, nil, 2, nil, 0, Needed);
pDrvInfo := PDriverInfo2(AllocMem(Needed));
try //for FreeMem
Win32Check(GetPrinterDriver(hPrinter, nil, 2,
pDrvInfo, Needed, Needed));
Driver := ExtractFileName(String(pDrvInfo^.pDriverPath));
Driver := ChangeFileExt(Driver, '');
DefaultPrinter := String(pInfo^.pPrinterName) + ','
+ Driver + ','
+ String(pInfo^.pPortName);
Win32Check(WriteProfileString('windows',
'device',
PChar(DefaultPrinter)));
finally
FreeMem(pDrvInfo);
end;
end;
begin
UniqueString(PrinterName); //不要かも?
FillChar(PDefaults, SizeOf(PDefaults), 0);
PDefaults.DesiredAccess := PRINTER_ALL_ACCESS;
Win32Check(OpenPrinter(PChar(PrinterName), hPrinter, @PDefaults));
try //for ClosePrinter
WinSpool.GetPrinter(hPrinter, 2, nil, 0, @Needed);
pInfo := PPrinterInfo2(AllocMem(Needed));
try //for FreeMem
Win32Check(WinSpool.GetPrinter(hPrinter, 2, pInfo,
Needed, @Needed));
with pInfo^ do begin
//pSecurityDescriptor := nil;
if DefaultFlag then
Attributes := Attributes or PRINTER_ATTRIBUTE_DEFAULT;
if DevMode <> nil then
pDevMode := DevMode;
end;
Win32Check(WinSpool.SetPrinter(hPrinter, 2, pInfo, 0));
if DefaultFlag then begin
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
//WinNTの場合、WIN.INIの変更で行う
SetDefaultUsePrinterNT;
end;
//「通常使うプリンタ」が変更されたことを通知する
PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
end;
finally
FreeMem(pInfo);
end;
finally
ClosePrinter(hPrinter);
end;
end;
----- ここまで -----
◆使用例
----- ここから -----
procedure TForm1.Button1Click(Sender: TObject);
var
Device, Driver, Port: array[0..79] of char;
DeviceMode: THandle;
DevMode: PDeviceMode;
begin
//プリンタ名、DEVMODE構造体を取得
Printer.PrinterIndex := 【ここで目的のプリンタを指定する】;
Printer.GetPrinter(Device, Driver, Port, DeviceMode);
Printer.SetPrinter(Device, Driver, Port, 0);
Printer.GetPrinter(Device, Driver, Port, DeviceMode);
if DeviceMode = 0 then begin
ShowMessage('Printer.GetPrinter エラー');
Exit;
end;
DevMode := GlobalLock(DeviceMode);
try
//必要なら、ここで DevModeを修正する
//↓ B5横 に設定する例
with DevMode^ do begin
dmPaperSize := DMPAPER_B5; //B5
dmOrientation := DMORIENT_LANDSCAPE; //横
end;
SetDefaultUsePrinter(Device {←これが「プリンタ名」です}
,True {「通常使うプリンタ」に設定する}
,DevMode {DEVMODE構造体を設定する}
);
finally
GlobalUnlock(DeviceMode);
end;
//ここで
//PrinterSetupDialog1.Execute;
//すれば、設定変更されていることが確認できると思います。
end;
----- ここまで -----
DEVMODE構造体の内容については、Win32APIヘルプを参照して下さい。
「通常使うプリンタ」の設定や、PRINTER_INFO_2構造体を使った
用紙サイズ等の設定変更については、過去ログでも何度か話題に
なっていたと思いますが、とりあえず私が使っているルーチンを
アップしてみました。(^_^;
Original document by Satobe 氏 ID:(JCG00336)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|