プリンタの切替「通常使うプリンタ」とプロパティ          <TOP>


接続されているプリンタを列挙し、選択したプリンタのプロパティダイアログを表示します。

EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙

RtlMoveMemory メモリブロックを別の領域に移動

OpenPrinter プリンタオブジェクトをオープン

ClosePrinter プリンタオブジェクトを閉じる

PrinterProperties プリンタ設定ダイアログ表示

SetDefaultPrinter 通常使うプリンタの設定

 

接続しているプリンタを列挙し、選択したプリンタを「通常使用するプリンタ」に設定するとともに、そのプリンタプロパティを表示します。

プロパティの表示例

 

'================================================================
'= プリンタの切替「通常使うプリンタ」とプロパティ
'= 通常使うプリンタの設定
'=    (PrinterProperties.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_INFO_5
    pPrinterName As Long
    pPortName    As Long
    Attributes   As Long
    DeviceNotSelectedTimeOut As Long
    TransmissionRetryTimeOut As Long
End Type

' 使用可能なプリンタ・プリントサーバーなどを列挙する
Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeededed&, pcReturned&)

' ある位置から別の位置にメモリブロックを移動
Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&)

' プリンタオブジェクトをオープン
Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName$, phPrinter&, pDefault As Any)

' プリンタオブジェクトを閉じる
Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&)

' プリンタ設定ダイアログ表示
Declare Function Api_PrinterProperties& Lib "winspool.drv" Alias "PrinterProperties" (ByVal hWnd&, ByVal hPrinter&)

' 通常使うプリンタの設定
Declare Function Api_SetDefaultPrinter& Lib "winspool.drv" Alias "SetDefaultPrinterA" (ByVal pszPrinter$)

#define PRINTER_ENUM_DEFAULT &H1        'デフォルトのプリンタに関する情報を列挙
#define PRINTER_ENUM_LOCAL &H2          'Nameの設定を無視して、ローカルプリンタを列挙
#define PRINTER_ENUM_NAME &H8           'Nameで指定されたプリンタを列挙
#define PRINTER_ENUM_SHARED &H20        '共有属性を持つプリンタを列挙
#define MAX_DEVICENAME 64

Var Shared List1 As Object
List1.Attach GetDlgItem("List1")
List1.SetFontSize 14

Var Shared PrinterName As String

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var PrintServer As String
    Var Needed As Long
    Var Returned As Long
    Var Level As Long
    Var CT As Long
    Var Ret As Long

    'ローカルプリンタから検索
    PrintServer = ""

    'PRINTER_INFO_5構造体を受け取る
    Level = 5

    'バッファに必要なバイト数を調べる
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Needed, Returned)
    If Needed = 0 Then End

    '全プリンタ情報を得る
    Var Buffer(Needed-1) As Byte
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Needed, Needed, Returned)

    '構造体リストの準備
    Var PI_5(Returned - 1) As PRINTER_INFO_5

    For CT = 0 To Returned - 1

        'バッファから構造体1つ分を抜き取る
        CopyMemory PI_5(CT), Buffer(CT * Len(PI_5(CT))), Len(PI_5(CT))

        'プリンタ名を得る
        PrinterName = String$(MAX_DEVICENAME, Chr$(0))
        CopyMemory PrinterName, ByVal PI_5(CT).pPrinterName, Len(PrinterName)
        PrinterName = KLeft$(PrinterName, kInStr(1, PrinterName, Chr$(0)) - 1)

        List1.AddString PrinterName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub List1_Change edecl ()
Sub List1_Change()
    Var hPrinter As Long
    Var Ret As Long

    PrinterName = List1.GetText(List1.GetCursel)

    Ret = Api_SetDefaultPrinter(PrinterName)
    Ret = Api_OpenPrinter(PrinterName, hPrinter, ByVal 0)
    Ret = Api_PrinterProperties(GethWnd, hPrinter)
    Ret = Api_ClosePrinter(hPrinter)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop