プリンタの詳細情報を取得          <TOP>


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

GetPrinter プリンタの詳細な情報を取得

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

MoveMemory メモリの指定領域をコピー

 

指定されたプリンタのプロパティで設定されている情報を取得しています。

ここでのプリンタ名(PrtDevName)は、直接指定しています。接続されているプリンタ名の取得は、「プリンタの固有情報を取得」を参照してください。

'================================================================
'= プリンタの詳細情報を取得
'=    (GetPrinter.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_DEFAULTS
    pDatatype     As Long
    pDevMode      As Long
    DesiredAccess As Long
End Type

Type PRINTER_INFO_5
    pPrinterName             As Long
    pPortName                As Long
    Attributes               As Long
    DeviceNotSelectedTimeout As Long
    TransmissionRetryTimeout As Long
End Type

#define STANDARD_RIGHTS_REQUIRED &HF0000 '標準的な権利を要求することを示す定数
#define PRINTER_ACCESS_ADMINISTER &H4    'プリンタアクセス権の管理者権限を示す定数の宣言
#define PRINTER_ACCESS_USE &H8           'プリンタアクセス権のユーザー権限を示す定数の宣言
#define PRINTER_ALL_ACCESS (&HF0000 or &H4 or &H8) '

#define PRINTER_ATTRIBUTE_DIRECT &H2            '直接データを送る
#define PRINTER_ATTRIBUTE_ENABLE_BIDI &H800     '双方向通信
#define PRINTER_ATTRIBUTE_ENABLE_DEVQ &H80      '一致しないドキュメントの保留
#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS &H100 '印刷後ドキュメントを残す
#define PRINTER_ATTRIBUTE_SHARED &H8            '共有

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

' プリンタの詳細な情報を取得
Declare Function Api_GetPrinter& Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal cbBuf&, pcbNeeded&)

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

' メモリの指定領域をコピー
Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&)

Var Shared Text1 As Object
Var Shared Text2 As Object
Var Shared Button1 As Object
Var Shared Combo1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14

Var Shared PrtDevName As String

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    'プリンタ名を指定
    PrtDevName = "KONICA MINOLTA magicolor 2400W"    'Printer.DeviceName
    Text1.SetWindowText PrtDevName

    Combo1.AddString "PRINTER_ATTRIBUTE_DIRECT"
    Combo1.AddString "PRINTER_ATTRIBUTE_ENABLE_BIDI"
    Combo1.AddString "PRINTER_ATTRIBUTE_ENABLE_DEVQ"
    Combo1.AddString "PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS"
    Combo1.AddString "PRINTER_ATTRIBUTE_SHARED"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var pd As PRINTER_DEFAULTS
    Var hPrinter As Long
    Var Level5 As Long
    Var Need As Long
    Var pi5 As PRINTER_INFO_5
    Var Flg As Integer
    Var Ret As Long

    'プリンタアクセス権を指定
    pd.DesiredAccess = PRINTER_ALL_ACCESS

    'プリンタのオブジェクトハンドルを取得
    Ret = Api_OpenPrinter(PrtDevName, hPrinter, pd)

    '構造体のレベルを指定
    Level5 = 5

    'バッファに必要なサイズを取得
    Ret = Api_GetPrinter(hPrinter, Level5, ByVal 0, 0, Need)

    'バッファを確保
    Var Buffer(Need - 1) As Byte

    '詳細なプリンタ情報を取得
    Ret = Api_GetPrinter(hPrinter, Level5, Buffer(0), Need, Need)

    '取得した詳細なプリンタ情報を構造体へ移動
    MoveMemory pi5, Buffer(0), Len(pi5)

    Flg = Combo1.GetCursel

    Select Case Flg

        '直接データを送る
        Case 0
            If pi5.Attributes And PRINTER_ATTRIBUTE_DIRECT Then
                Text2.SetWindowText "「直接データを送る」が指定されています。"
            Else
                Text2.SetWindowText "「直接データを送る」が指定されていません。"
            End If

        '双方向通信
        Case 1
            If pi5.Attributes And PRINTER_ATTRIBUTE_ENABLE_BIDI Then
                Text2.SetWindowText "「双方向通信」が指定されています。"
            Else
                Text2.SetWindowText "「双方向通信」が指定されていません。"
            End If

        '一致しないドキュメントの保留
        Case 2
            If pi5.Attributes And PRINTER_ATTRIBUTE_ENABLE_DEVQ Then
                Text2.SetWindowText "「ドキュメントの保留」が指定されています。"
            Else
                Text2.SetWindowText "「ドキュメントの保留」が指定されていません。"
            End If

        '印刷後ドキュメントを残す
        Case 3
            If pi5.Attributes And PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS Then
                Text2.SetWindowText "「印刷後ドキュメントを残す」が指定されています。"
            Else
                Text2.SetWindowText "「印刷後ドキュメントを残す」が指定されていません。"
            End If

        '共有
        Case 4
            If pi5.Attributes And PRINTER_ATTRIBUTE_SHARED Then
                Text2.SetWindowText "「共有」が指定されています。"
            Else
                Text2.SetWindowText "「共有」が指定されていません。"
            End If
        Case Else
            Text2.SetWindowtext "ComboBoxの項目を選択してください"
    End Select

    'プリンタオブジェクトをクローズ
    Ret = Api_ClosePrinter(hPrinter)
End Sub

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