プリンタの速度を取得 <TOP>
DeviceCapabilities
プリンタデバイスドライバの能力を取得
CopyMemory
ある位置から別の位置にメモリブロックを移動
EnumPrinters
使用可能なプリンタ・プリントサーバーなどを列挙
DC_PRINTRATE(26) 速度を取得することを示す
DC_PRINTRATEUNIT(27) 速度の単位を取得することを示す
'================================================================ '= プリンタの速度を取得 '= (DC_PRINTRATE.bas) '================================================================ #include "Windows.bi" #define PRINTER_ENUM_DEFAULT &H1 'デフォルトのプリンタに関する情報を列挙 #define PRINTER_ENUM_LOCAL &H2 'Nameの設定を無視して、ローカルプリンタを列挙 #define PRINTER_ENUM_NAME &H8 'Nameで指定されたプリンタを列挙 #define PRINTER_ENUM_SHARED &H20 '共有属性を持つプリンタを列挙 #define MAX_DEVICENAME 64 ' #define DC_PRINTRATE 26 '速度を取得することを示す定数 #define DC_PRINTRATEUNIT 27 '速度の単位を取得することを示す定数 #define PRINTRATEUNIT_PPM 1 'PPM単位を示す定数 #define PRINTRATEUNIT_CPS 2 'CPS単位を示す定数 #define PRINTRATEUNIT_LPM 3 'LPM単位を示す定数 #define PRINTRATEUNIT_IPM 4 'IPM単位を示す定数 Type PRINTER_INFO_5 pPrinterName As Long pPortName As Long Attributes As Long DeviceNotSelectedTimeOut As Long TransmissionRetryTimeOut As Long End Type ' プリンタデバイスドライバの能力を取得 Declare Function Api_DeviceCapabilities& Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName$, ByVal lpPort$, ByVal iIndex&, lpOutput As Any, lpDevMode As Any) ' ある位置から別の位置にメモリブロックを移動する関数の宣言 Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&) ' 使用可能なプリンタ・プリントサーバーなどを列挙する Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeeded&, pcReturned&) Var Shared Combo1 As Object Var Shared Text1 As Object Var Shared Button1 As Object Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14 Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Var Shared PrinterName As String '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var PrintServer As String Var Needed 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, Needed, Returned) If Needed = 0 Then End '全プリンタ情報を得る Var Buffer(Needed - 1) As byte Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Needed, Needed, 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 DeviceCapability As Long Var PortName As String Var PrintRate As Long Var PrintRateUnit As Long 'デバイス名 PrinterName = Combo1.GetText(Combo1.GetCursel) '問い合わせる能力を指定 DeviceCapability = DC_PRINTRATE '速度を取得 PrintRate = Api_DeviceCapabilities(PrinterName, PortName, DeviceCapability, ByVal 0, ByVal 0) '問い合わせる能力を指定 DeviceCapability = DC_PRINTRATEUNIT '速度の単位を取得 PrintRateUnit = Api_DeviceCapabilities(PrinterName, PortName, DeviceCapability, ByVal 0, ByVal 0) '取得できたときは If PrintRate > 0 Then '速度の単位で分岐 Select Case PrintRateUnit 'PPMのときは Case PRINTRATEUNIT_PPM Text1.SetWindowText Str$(PrintRate) & "ppm" 'CPSのときは Case PRINTRATEUNIT_CPS Text1.SetWindowText Str$(PrintRate) & "cps" 'LPMのときは Case PRINTRATEUNIT_LPM Text1.SetWindowText Str$(PrintRate) & "lpm" 'IPMのときは Case PRINTRATEUNIT_IPM Text1.SetWindowText Str$(PrintRate) & "ipm" Case Else Text1.SetWindowText Str$(PrintRate) & "(単位不明)" End Select '取得できないとき Else Text1.SetWindowText "取得できません!" End If End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End