본문 바로가기

카테고리 없음

[윈도우즈 API] 다양한 종류의 파일들을 연결 프로그램으로 한꺼번에 인쇄하기

// 윈도우즈 탐색기에서 파일 리스트 창에서 파일을 선택하고 마우스 오른쪽을 클릭하면
// 파일의 확장자를 기준으로 연결된(association) 프로그램이 존재하고 또한 이 파일을
// 인쇄할 수 있다면 탐색기 팝업 메뉴에 '인쇄'가 나타납니다
// 이것을 이용하여 사용자가 선택한 여러 파일들의 확장자를 레지스트리에서 검색하여
// 파일 각각의 연결 프로그램을 찾아 인쇄하는 예제입니다

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry, SHellAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.Options := OpenDialog1.Options + [ofAllowMultiSelect, ofFileMustExist];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  reg: TRegistry;
  dvalue, pcommand: String;
begin
  Memo1.Clear;
  if not OpenDialog1.Execute then
    Exit;

  reg := TRegistry.Create;
  reg.RootKey := HKEY_CLASSES_ROOT;
  try
    for i := 0 to OpenDialog1.Files.Count-1 do
    begin
      // 레지스트리의 HKEY_CLASSES_ROOT에서 확장자의 기본값을 구한다
      dvalue := '';
      reg.OpenKey('\'+ExtractFileExt(OpenDialog1.Files[i]), false);
      dvalue := reg.ReadString('');
      reg.CloseKey;

      // 해당 확장자를 인쇄하는데 사용하는 명령어를 구한다
      pcommand := '';
      if dvalue <> '' then
      begin
        reg.OpenKey(dvalue+'\shell\print\command', false);
        pcommand := reg.ReadString('');
        reg.CloseKey;
      end;

      if pcommand <> '' then
      begin
        Memo1.Lines.Add('['+IntToStr(i)+'] '+
                        ExtractFileName(OpenDialog1.Files[i])+' => '+
                        ExtractFileName(pcommand)+' 로 인쇄');
          
        // 실제로 인쇄
        //ShellExecute(Handle, 'print', pchar(OpenDialog1.Files[i]), nil, nil, SW_HIDE);
      end
      else
      begin
        Memo1.Lines.Add('['+IntToStr(i)+'] '+
                        ExtractFileName(OpenDialog1.Files[i])+' => '+
                        '*** 인쇄할수 없음 ***');
      end;
    end;
  finally
    reg.Free;
  end;
end;

end.