プリンタのカラー印刷サポートを判定          <TOP>


CopyMemory マウスホイールのスクロール量を取得・設定します。ある位置から別の位置にメモリブロックを移動
EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙
SHInvokePrinterCommand プリンタのプロパティ取得等のコマンドを実行
DeviceCapabilities プリンタデバイスドライバの能力を取得
 

 
'================================================================
'= プリンタのカラー印刷サポートを判定
'=    (DC_COLORDEVICE.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_COLORDEVICE 32

Type PRINTER_INFO_5
    pPrinterName As Long
    pPortName    As Long
    Attributes   As Long
    DeviceNotSelectedTimeOut As Long
    TransmissionColorDeviceryTimeOut As Long
End Type

' ある位置から別の位置にメモリブロックを移動する関数の宣言
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&)

' プリンタのプロパティ取得等のコマンドを実行
Declare Function Api_SHInvokePrinterCommand& Lib "Shell32" Alias "SHInvokePrinterCommandA" (ByVal hWnd&, ByVal uAction&, ByVal lpBuf1$, ByVal lpBuf2$, ByVal fModal&)

' プリンタデバイスドライバの能力を取得
Declare Function Api_DeviceCapabilities& Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName$, ByVal lpPort$, ByVal iIndex&, lpOutput As Any, lpDevMode As Any)

Var Shared Text(2) As Object
Var Shared Combo1 As Object
Var Shared Button1 As Object

For i = 0 To 2
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
    Text(i).SetFontSize 14
Next
Combo1.Attach GetDlgItem("Combo1") : Combo1.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 ColorDevice As Long

    'ローカルプリンタから検索
    PrintServer = ""

    'PRINTER_INFO_5構造体を受け取る
    Level = 5

    'バッファに必要なバイト数を調べる
    ColorDevice = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Needed, Returned)
    If Needed = 0 Then End

    '全プリンタ情報を得る
    Var Buffer(Needed - 1) As byte
    ColorDevice = 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 DeviceCapa As Long
    Var txt As String
    Var ColorDevice As Long

    PrinterName = Combo1.GetWindowText
    If PrinterName = "" Then
        A% = MessageBox(GetWindowtext, "プリンタ名を指定してください!", 0, 2)
        Exit Sub
    End If

    '問い合わせる能力を指定
    DeviceCapa = DC_COLORDEVICE

    'カラー印刷サポートを判定
    ColorDevice = Api_DeviceCapabilities(PrinterName, "", DeviceCapa, ByVal 0, ByVal 0)

    'カラー印刷サポートを表示
    Select Case ColorDevice
        Case 0
            txt = "サポートしません。"
        Case 1
            txt = "サポートします。"
        Case Else
            txt = "判定できません。"
    End Select

    Text(2).SetWindowText txt
End Sub

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