Q&A

  • 기본프린터변경
기본프린터변경에 관한 질문입니다.

레지스트리에서 컴퓨터에 설치된 프린터들의 목록을 가져와 Radio Group에

출력시키고 그 Radio Group에서 선택된 프린터를 기본프린터로 바꾸는

프로그램을 작성하고 있는데 어떻게 해야할지...

아시는 분 도움을 주세요~~~

2  COMMENTS
  • Profile
    김영대 1999.07.29 23:20
    최현정 께서 말씀하시기를...

    > 기본프린터변경에 관한 질문입니다.

    > 레지스트리에서 컴퓨터에 설치된 프린터들의 목록을 가져와 Radio Group에

    > 출력시키고 그 Radio Group에서 선택된 프린터를 기본프린터로 바꾸는

    > 프로그램을 작성하고 있는데 어떻게 해야할지...

    > 아시는 분 도움을 주세요~~~



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, WinSpool, IniFiles;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    ListBox1: TListBox;

    Memo1: TMemo;

    procedure FormActivate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure ListBox1Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    pEnumDriversData: PDriverInfo2;

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure TForm1.FormActivate(Sender: TObject);

    var

    i, bytesNeeded: DWORD;

    pTemp: PDriverInfo2;

    NumDrivers: DWORD;

    begin

    Listbox1.Clear;

    if Assigned(pEnumDriversData) Then

    FreeMem(pEnumDriversData);



    // 설치된 모든 프린터 드라이브 갯수를 구한다

    Numdrivers := 0;

    bytesNeeded := 0;

    EnumPrinterDrivers(nil, nil, 2, Nil, 0, bytesNeeded, NumDrivers); // 2번 정보

    if bytesNeeded = 0 then

    begin

    ShowMEssage('설치된 프린터 드라이브가 없습니다');

    System.Exit;

    end;



    // 정보를 저장할 메모리를 만든다

    GetMem(pEnumDriversData, bytesNeeded);

    // 설치된 모든 프린터 드라이브 정보(2번)를 구한다

    // 서버명이 생략되었으므로 내 PC의 드라이버를 읽는다

    if EnumPrinterDrivers(nil, nil, 2, pEnumDriversData, bytesNeeded,

    bytesNeeded, NumDrivers) then

    begin

    pTemp := pEnumDriversData;

    for i:= 1 to Numdrivers do

    begin

    // 드라이버명과 스트럭쳐의 시작 포인터를 Object로 ListBox에 추가한다

    Listbox1.Items.AddObject(pTemp^.pName, TObject(pTemp));

    // 다음 드라이버 정보의 스트럭쳐로 포인터를 이동시킨다

    // Note: Inc increments a pointer by the size of its base type!

    Inc(pTemp);

    end;

    Listbox1.ItemIndex := 0;

    Listbox1Click(Listbox1);

    end

    else

    RaiseLastWin32Error;

    end;



    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    if Assigned(pEnumDriversData) then

    FreeMem(pEnumDriversData);

    end;



    // 선택한 프린터의 정보를 Memo에 출력한다

    procedure TForm1.ListBox1Click(Sender: TObject);

    var

    pTemp: PDriverInfo2;

    begin

    with Sender as TListbox do

    begin

    if ItemIndex >= 0 then

    begin

    Memo1.Clear;

    pTemp:= PDriverInfo2(Items.Objects[ItemIndex]);

    with Memo1.Lines, pTemp^ do

    begin

    Add(Format('Version:'#9#9'%d', [cVersion]));

    Add(Format('Name:'#9#9'%s', [pName]));

    Add(Format('Environment:'#9'%s', [pEnvironment]));

    Add(Format('DriverPath:'#9'%s', [pDriverPath]));

    Add(Format('DataFile:'#9#9'%s', [pDataFile]));

    Add(Format('ConfigFile:'#9'%s', [pConfigFile]));

    end;

    end;

    end;

    end;



    // 선택한 프린터를 기본 프린터로 설정한다

    procedure TForm1.Button1Click(Sender: TObject);

    var

    pTemp: PDriverInfo2;

    WinIni: TIniFile;

    WinIniFileName: array[0..MAX_PATH] of char;

    s: array[0..64] of char;

    DirverName: String;

    begin

    if ListBox1.ItemIndex >= 0 then

    begin

    pTemp:= PDriverInfo2(ListBox1.Items.Objects[ListBox1.ItemIndex]);

    DirverName := Copy(DirverName,1,Length(DirverName)-Length(ExtractFileExt(DirverName)));



    // Windows.ini 파일의 "Windows" 섹션에 "printer, driver, port" 를

    // 지정하여 기본프린터를 바꾼다

    // 이때 기본프린터 변경여부를 다른 애플리케이션들에게

    // 알리기 위해 WM_WININICHANGE 메시지를 BroadCast 한다

    GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));

    StrCat(WinIniFileName, 'win.ini');

    WinIni := TIniFile.Create(WinIniFileName);

    WinIni.WriteString('windows',

    'device',

    StrPas(pTemp^.pName)+','+ // 프린터명

    DirverName+',LPT1:'); // 드리아버명, 포트

    WinIni.Free;

    StrCopy(S, 'windows');

    SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));



    ShowMessage('기본 프린터를 "'+StrPas(pTemp^.pName)+'"로 변경하였숩니다');

    end;

    end;



    end.



  • Profile
    박흥태 1999.07.29 22:50
    최현정 께서 말씀하시기를...

    > 기본프린터변경에 관한 질문입니다.

    > 레지스트리에서 컴퓨터에 설치된 프린터들의 목록을 가져와 Radio Group에

    > 출력시키고 그 Radio Group에서 선택된 프린터를 기본프린터로 바꾸는

    > 프로그램을 작성하고 있는데 어떻게 해야할지...

    > 아시는 분 도움을 주세요~~~



    이내용은 제가 인프라이즈 - 델파이 FAQ에서 가져온 것입니당.



    FAQ2618D.txt - Changing windows default printer in code.





    Category :Printing

    Platform :All-32Bit

    Product :



    Question:

    How do I change the default Windows printer?





    Answer:

    You need to change the printer, driver, and port as listed in the

    device key of the Windows section in the Windows.ini file, then

    broadcast a system wide WM_WININICHANGE message.



    Example:



    procedure TForm1.Button1Click(Sender: TObject);

    var

    WinIni : TIniFile;

    WinIniFileName : array[0..MAX_PATH] of char;

    s : array[0..64] of char;



    begin

    GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));

    StrCat(WinIniFileName, 'win.ini');

    WinIni := TIniFile.Create(WinIniFileName);

    try

    WinIni.WriteString('windows',

    'device',

    'HP LaserJet Series II,HPPCL,LPT1:');

    finally

    WinIni.Free;

    end;



    StrCopy(S, 'windows');

    SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));

    end;



    그럼 즐거운 하루를 ~~~