C++Builder Tips


プリンタ・「通常使うプリンタ」に設定する


プリンタの一覧をリストボックスに出力し、そのリストボックスの中で選択されたプリンタを「通常使うプリンタ」に設定します。



//---------------------------------------------------------------------------
//  Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Printers.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int i;
  AnsiString str;

  //プリンタの一覧をリストボックスに出力
  for (i = 0;i < Printer()->Printers->Count;i++){
     str = Printer()->Printers->Strings[i];
     ListBox1->Items->Add(str);
  }

  //「通常使うプリンタ」に設定されているプリンタを選択状態に
  ListBox1->ItemIndex= Printer()->PrinterIndex;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int i;

  for (i=0;i<Printer()->Printers->Count;i++){
    if (ListBox1->Selected[i]){
      Printer()->PrinterIndex = i;
      break;
    }
  }

  //選択されたプリンタ名の取得
  char cPrtname[256];
  char cPrtdrv[256];
  char cPrtport[256];
  THandle devm;
  TDevMode *dmw;

  Printer()->GetPrinter(cPrtname,cPrtdrv,cPrtport,devm);

  //通常使うプリンタを変更します。
  OSVERSIONINFO osInfo;

  osInfo.dwOSVersionInfoSize = sizeof(osInfo);
  GetVersionEx(&osInfo);
  switch (osInfo.dwPlatformId){
    case VER_PLATFORM_WIN32_WINDOWS:
      ChgDefaultPrinter95(cPrtname);
      break;
    case VER_PLATFORM_WIN32_NT:
      ChgDefaultPrinterNT(cPrtname);
      break;
  }

  AnsiString str = cPrtname;
  ShowMessage(str + "を「通常使うプリンタ」に設定しました。");
}
//---------------------------------------------------------------------------
bool TForm1::ChgDefaultPrinter95(char* cPrtname)
{
  HANDLE hPrinter;
  DWORD dwBytesReturned;
  DWORD dwBytesNeeded;
  PRINTER_INFO_2* pi;
  PRINTER_DEFAULTS pd;
  bool bRet;
  AnsiString msg;

  bRet = OpenPrinter(cPrtname, &hPrinter, 0);
  if (bRet == false){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinter95>",MB_OK);
    return false;
  }

  //PRINTER_INFO_2に必要なバッファサイズ取得(この呼び出しではFalseが返る)
  bRet = GetPrinter(hPrinter,2,NULL,0,&dwBytesNeeded);

  //PRINTER_INFO_2に必要なバッファ取得
  pi = (PRINTER_INFO_2*)GlobalAlloc(GPTR,dwBytesNeeded);

  //プリンタの情報取得
  bRet = GetPrinter(hPrinter,2,(LPBYTE)pi,dwBytesNeeded,&dwBytesReturned);
  if (bRet == false){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinter95>",MB_OK);
    return false;
  }

  //「通常使うプリンタ」に設定
  pi->Attributes = pi->Attributes | PRINTER_ATTRIBUTE_DEFAULT;
  bRet = SetPrinter(hPrinter,2,(LPBYTE)pi,PRINTER_CONTROL_SET_STATUS);
  if (bRet == false){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinter95>",MB_OK);
    return false;
  }

  //取得したバッファ解放
  GlobalFree(pi);

  bRet = ClosePrinter(hPrinter);
  if (bRet == false){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinter95>",MB_OK);
    return false;
  }
  return true;
}

//---------------------------------------------------------------------------
bool TForm1::ChgDefaultPrinterNT(char* cPrtname)
{
  char cPrtdev[256];
  DWORD dwRet;
  bool bRet;
  LRESULT lRet;
  AnsiString msg;

  dwRet = GetProfileString("Devices",cPrtname,"",cPrtdev,sizeof(cPrtdev));
  if (dwRet == 0){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinterNT>",MB_OK);
    return false;
  }

 
 //通常使うプリンタの変更
  lstrcat(cPrtname,",");
  lstrcat(cPrtname,cPrtdev);
  bRet = WriteProfileString("windows", "device", cPrtname);
  if (bRet == false){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinterNT>",MB_OK);
    return false;
  }
  //WIN.INIの変更をWindowsに知らせる
  lRet = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L, SMTO_NORMAL, 1000, NULL);
  if (lRet == 0){
    msg = SysErrorMessage(GetLastError());
    Application->MessageBox(msg.c_str(),"<ChgDefaultPrinterNT>",MB_OK);
    return false;
  }
  return true;
}


DownLoad bcbtips030.lzh 4KB(BCB5)