プリンタの利用できる給紙方法・最大部数取得          <TOP>


選択したプリンタの利用できる給紙方法を取得します。

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

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

DeviceCapabilities プリンタデバイスドライバの能力を取得

 

接続されているプリンタ名およびポート名がコンボボックスにリスト表示されます。

リスト行を選択し取得ボタンをクリックすることにより使用できる用紙の種類が表示されます。

 

 

'================================================================
'= プリンタの利用できる給紙方法・最大部数取得
'=    (Devicecapabilities2.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& , pcbNeeded& , pcReturned& )

#define PRINTER_ENUM_NAME &H8           '
#define MAX_DEVICENAME 64               '

' メモリブロックを別の領域に移動する
Declare Sub Api_MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&)

' プリンタデバイスドライバの能力を取得する関数の宣言
Declare Function Api_DeviceCapabilities& Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName$, ByVal lpPort$, ByVal iIndex&, lpOutput As Any, lpDevMode As Any)

#define DC_ACTIVE 1                     'アクティブなときの色
#define DC_BINS 6                       'プリンタで使用できる給紙方法を取得することを示す定数の宣言
#define DC_COPIES 18                    '最大部数を取得することを示す定数の宣言
#define DC_GRADIENT &H20                'グラデーション
#define DC_ICON 4                       'アイコン付き
#define DC_INBUTTON &H10                'ボタンとして描画
#define DC_NOTACTIVE &H2                '
#define DC_SMALLCAP 2                   '幅の狭いタイプ
#define DC_TEXT 8                       'タイトルテキスト付き

' 給紙方法を示す定数の宣言
#define DMBIN_CASSETTE 14               '用紙カセット
#define DMBIN_ENVELOPE 5                '封筒フィーダ
#define DMBIN_ENVMANUAL 6               '手差し封筒フィーダ
#define DMBIN_FORMSOURCE 15             '
#define DMBIN_LARGECAPACITY 11          '
#define DMBIN_LARGEFMT 10               '大型用紙ソース
#define DMBIN_LOWER 2                   '下用紙トレイ
#define DMBIN_MANUAL 4                  '手差し用紙フィーダ
#define DMBIN_MIDDLE 3                  '中用紙トレイ
#define DMBIN_ONLYONE 1                 '単一用紙ソース
#define DMBIN_SMALLFMT 9                '小型用紙ソース
#define DMBIN_TRACTOR 8                 'トラクタフィーダ
#define DMBIN_UPPER 1                   '上用紙フィーダ
#define DMBIN_USER 256                  'ユーザ定義

Var Shared List1 As Object
Var Shared Combo1 As Object
Var Shared Text(7) As Object

Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
For i = 0 To 7
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
    Text(i).SetFontSize 14
Next i

Var Shared PrinterName As String
Var Shared PortName As String

'================================================================
'=
'================================================================
Declare Sub Mainform_Start edecl ()
Sub Mainform_Start()
    Var PrintServer As String
    Var Need 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, Need, Returned)
    If Need = 0 Then End

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

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

    For CT = 0 To Returned - 1

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

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

        'ポート名を得る
        PortName = String$(MAX_DEVICENAME, Chr$(0))
        Api_MoveMemory PortName , ByVal PI_5( CT ).pPortName, Len( PortName )
        PortName = kLeft$(PortName, KInStr(1, PortName, Chr$(0)) - 1)
        Combo1.AddString Left$(PrinterName & space$(16), 16) & PortName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Combo1_Change edecl ()
Sub Combo1_Change()
    PrinterName = Trim$(Left$(Combo1.GetText(Combo1.GetCursel), 16))
    PortName = Trim$(Mid$(Combo1.GetText(Combo1.GetCursel), 17))
    Text(5).SetWindowText PrinterName
    Text(6).SetWindowText PortName
    List1.ResetContent
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    on error goto *ER_Trap

    Var DeviceCapability As Long
    Var DeviceCopies As Long
    Var Need As Long
    Var CT As Long
    Var Ret As Long

    'リストボックスを初期化
    List1.ResetContent

    '問い合わせる能力を指定
    DeviceCapability = DC_BINS

    'バッファに必要なサイズを取得
    Need = Api_DeviceCapabilities(PrinterName, PortName, DeviceCapability, ByVal 0, ByVal 0)

    'バッファを確保
    Var Bins(Need - 1) As Integer

    '使用できる給紙方法を取得
    Ret = Api_DeviceCapabilities(PrinterName, PortName, DeviceCapability, Bins(0), ByVal 0)

    '使用できる給紙方法を列挙
    For CT = 0 To Need - 1
        '給紙方法を表示
        Select Case Bins(CT)
            Case DMBIN_UPPER
                List1.AddString "UPPER"
            Case DMBIN_ONLYONE
                List1.AddString "ONLYONE"
            Case DMBIN_LOWER
                List1.AddString "LOWER"
            Case DMBIN_MIDDLE
                List1.AddString "MIDDLE"
            Case DMBIN_MANUAL
                List1.AddString "MANUAL"
            Case DMBIN_ENVELOPE
                List1.AddString "ENVELOPE"
            Case DMBIN_ENVMANUAL
                List1.AddString "ENVMANUAL"
            Case DMBIN_AUTO
                List1.AddString "AUTO"
            Case DMBIN_TRACTOR
                List1.AddString "TRACTOR"
            Case DMBIN_SMALLFMT
                List1.AddString "SMALLFMT"
            Case DMBIN_LARGEFMT
                List1.AddString "LARGEFMT"
            Case DMBIN_LARGECAPACITY
                List1.AddString "LARGECAPACITY"
            Case DMBIN_CASSETTE
                List1.AddString "CASSETTE"
            Case DMBIN_FORMSOURCE
                List1.AddString "FORMSOURCE"
            Case Else
                'ユーザー定義のときは
                If Bins(CT) >= DMBIN_USER Then
                    List1.AddString "USER" & "(" & Str$(Bins(CT)) & ")"
                '未定義のときは
                Else
                    List1.AddString "UNKNOWN" & "(" & Str$(Bins(CT)) & ")"
                End If
        End Select
    Next CT

    '問い合わせる能力を指定
    DeviceCapability = DC_COPIES

    '最大部数を取得
    Ret = Api_DeviceCapabilities(PrinterName, PortName, DeviceCapability, ByVal 0, ByVal 0)
    Text(7).SetWindowText Str$(Ret) & "枚"
    Exit Sub

    *ER_Trap
    Resume Next
End Sub

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