プリンタの固有情報を取得 <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