プリンタの固有情報を取得          <TOP>


接続されているプリンタを列挙し、選択したプリンタの固有情報を取得表示します。

EnumPrinters 使用可能なプリンタ等を列挙

CopyMemory メモリブロックの移動

GetDeviceCaps デバイス固有の情報を取得

CreateDC デバイスコンテキストを指定された名前で作成

 

 

'================================================================
'= プリンタの固有情報を取得
'=    (GetDeviceCaps3.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&)

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

' デバイス固有の情報を取得
Declare Function Api_GetDeviceCaps& Lib "gdi32" Alias "GetDeviceCaps" (ByVal hDC&, ByVal nIndex&)

' 指定されたデバイスのデバイスコンテキストを、指定された名前で作成
Declare Function Api_CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName$, ByVal lpDevName$, ByVal lpOutput$, ByVal lpInitData&)

#define PRINTER_ENUM_NAME &H8           'Nameで指定されたプリンタを列挙
#define MAX_DEVICENAME 64               '

#define DT_BOTTOM &H8                   '長方形の下辺にテキストを揃える。DT_SINGLELINEと同時に指定する
#define DT_CALCRECT &H400               'テキストを表示するために必要な長方形の大きさをlpRectパラメータに格納
#define DT_CENTER &H1                   'テキストを水平方向に中央揃えで表示します。
#define DT_CHARSTREAM 4                 'CharacterStream
#define DT_DISPFILE 6                   'DisplayFile
#define DT_ListCONTROL &H2000           '複数行エディットコントロールと同じ特性で描画
#define DT_EXPANDTABS &H40              '[TAB]をスペースに変換
#define DT_EXTERNALLEADING &H200        '行の高さに、外部レディングの高さ(行間として適当な高さ)を加える
#define DT_LEFT &H0                     'テキストを左揃え
#define DT_METAFILE 5                   'Metafile
#define DT_MODIFYSTRING &H10000         'DT_END_ELLIPSISフラグ、DT_PATH_ELLIPSISフラグによって変更された文字列をlpStringに格納
#define DT_NOCLIP &H100                 'クリッピングを行わない
#define DT_NOPREFIX &H800               'プリフィックス文字(「&」を次の文字のアンダースコアに置き換える、「&&」を「&」として処理する)の処理を
#define DT_PATH_ELLIPSIS &H4000         '指定した長方形領域にテキストが収まらない場合、テキストの途中を(…)に置き換える
#define DT_PLOTTER 0                    'ベクタプロッタ
#define DT_RASCAMERA 3                  'ラスタカメラ
#define DT_RASDISPLAY 1                 'ラスタディスプレイ
#define DT_RASPRINTER 2                 'ラスタプリンタ
#define DT_RIGHT &H2                    'テキストを右揃え
#define DT_RTLREADING &H20000           '右から左に向かってテキストを表示。ヘブライ語、アラビア語などを表示する場合に利用する
#define DT_SINGLELINE &H20              'テキストを改行せず、一行で表示
#define DT_TABSTOP &H80                 'タブ文字の空白文字数を設定。このフラグを指定した場合はDRAWTEXTPARAMS構造体のiTabLengthメンバで空白文
#define DT_TOP &H0                      '上揃え。DT_SINGLELINEと同時に指定する必要がある
#define DT_VCENTER &H4                  'テキストを垂直方向の中央揃え。DT_SINGLELINEと同時に指定する必要がある
#define DT_WORDBREAK &H10               'テキストを複数行で表示。折り返しは自動的に行われる

#define DRIVERVERSION 0                 'デバイスドライバーのバージョン番号
#define TECHNOLOGY 2                    'デバイス技術を指定する次の定数
#define HORZSIZE 4                      '物理画面の幅(ミリメートル単位)
#define VERTSIZE 6                      '物理画面の高さ(ミリメートル単位)
#define HORZRES 8                       '画面の幅(ピクセル単位)
#define VERTRES 10                      '画面の高さ(ピクセル単位)
#define NUMBRUSHES 16                   'デバイス固有のブラシ数
#define NUMPENS 18                      'デバイス固有のペンの数
#define NUMCOLORS 24                    'デバイスのカラーテーブル内のエントリ数
#define LOGPIXELSX 88                   'ディスプレイの幅のピクセル数(Pixel/inch)
#define LOGPIXELSY 90                   'ディスプレイの高さのピクセル数(Pixel/inch)

Var Shared PrinterName As String

Var Shared List1 As Object
Var Shared Combo1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFOntSize 14

'================================================================
'=
'================================================================
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

    'ローカルプリンタから検索(サーバー名 \\xxx 指定可)
    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つ分を抜き取る
        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)

        Combo1.AddString PrinterName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var phDC As Long
    Var Ret As Long
    
    'プリンタ名から、そのデバイスコンテキストを作成
    phDC = Api_CreateDc("WinSpool", PrinterName, ByVal 0, 0)
    
    List1.Resetcontent
    List1.AddString PrinterName
    List1.AddString "-------------------------------------"
    
    'デバイス固有の情報を取得
    Ret = Api_GetDeviceCaps(phDc, TECHNOLOGY)
    Select Case Ret
        Case DT_PLOTTER
            List1.AddString "デバイス技術  = プロッタ"
        Case DT_RASDISPLAY
            List1.AddString "デバイス技術  = ラスタディスプレイ"
        Case DT_RASPRINTER
            List1.AddString "デバイス技術  = ラスタプリンタ"
        Case DT_RASCAMERA
            List1.AddString "デバイス技術  = ラスタカメラ"
        Case DT_CHARSTREAM
            List1.AddString "デバイス技術  = 文字ストリーム"
        Case DT_METAFILE
            List1.AddString "デバイス技術  = メタファイル"
        Case DT_DISPFILE
            List1.AddString "デバイス技術  = ディスプレイファイル"
    End Select
    
    List1.AddString "ドライババージョン =" & Str$(Api_GetDeviceCaps(phDc, DRIVERVERSION))
    List1.AddString "幅(mm)        =" & Str$(Api_GetDeviceCaps(phDc, HORZSIZE))
    List1.AddString "高さ(mm)      =" & Str$(Api_GetDeviceCaps(phDc, VERTSIZE))
    List1.AddString "幅(Px)        =" & Str$(Api_GetDeviceCaps(phDc, HORZRES))
    List1.AddString "高さ(Px)      =" & Str$(Api_GetDeviceCaps(phDc, VERTRES))
    List1.AddString "幅(DPI)       =" & Str$(Api_GetDeviceCaps(phDc, LOGPIXELSX))
    List1.AddString "高さ(DPI)     =" & Str$(Api_GetDeviceCaps(phDc, LOGPIXELSY))
    List1.AddString "ブラシ数      =" & Str$(Api_GetDeviceCaps(phDc, NUMBRUSHES))
    List1.AddString "ペン数        =" & Str$(Api_GetDeviceCaps(phDc, NUMPENS))
    List1.AddString "カラー数      =" & Str$(Api_GetDeviceCaps(phDc, NUMCOLORS))
End Sub

'================================================================
'=
'================================================================
Declare Sub Combo1_Change edecl ()
Sub Combo1_Change()
    PrinterName = Combo1.GetWindowText
End Sub

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