プリンタの利用できる給紙方法・最大部数取得 <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