プリンタの一覧をリストボックスに出力し、そのリストボックスの中で選択されたプリンタを「通常使うプリンタ」に設定します。
//---------------------------------------------------------------------------
// 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)