プリンタの一致しないドキュメントの保留を設定          <TOP>


EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙
OpenPrinter プリンタオブジェクトをオープン
GetPrinter プリンタの詳細な情報を取得
MoveMemory メモリの指定領域をコピー
SetPrinter プリンタの詳細な情報を設定
ClosePrinter プリンタオブジェクトを閉じる


右図は、プリンターのプロパティ「詳細設定」の一部を表しています。

参考

プリンタの詳細情報を取得

 

'================================================================
'= プリンタの一致しないドキュメントの保留を設定
'=    (PRINTER_ATTRIBUTE_ENABLE_DEVQ.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_DEFAULTS
    pDatatype     As Long
    pDevMode      As Long
    DesiredAccess As Long
End Type

Type PRINTER_INFO_5
    pPrinterName             As Long
    pPortName                As Long
    Attributes               As Long
    DeviceNotSelectedTimeout As Long
    TransmissionRetryTimeout As Long
End Type

#define STANDARD_RIGHTS_REQUIRED &HF0000           '標準的な権利を要求することを示す定数
#define PRINTER_ACCESS_ADMINISTER &H4              'プリンタアクセス権の管理者権限を示す
#define PRINTER_ACCESS_USE &H8                     'プリンタアクセス権のユーザー権限を示す
#define PRINTER_ALL_ACCESS (&HF0000 or &H4 or &H8) '
#define PRINTER_ATTRIBUTE_ENABLE_DEVQ &H80         '一致しないドキュメントの保留
#define ERROR_INVALID_SHARENAME 1215               '共有名無効の拡張エラーを示す定数
#define PRINTER_ENUM_NAME &H8                      'Nameで指定されたプリンタを列挙
#define MAX_DEVICENAME 64                          '

' 使用可能なプリンタ・プリントサーバーなどを列挙する
Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeededed&, pcReturned&)

' プリンタオブジェクトをオープン
Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName$, phPrinter&, pDefault As Any)

' プリンタの詳細な情報を取得
Declare Function Api_GetPrinter& Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal cbBuf&, pcbNeededed&)

' メモリの指定領域をコピー
Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Length&)

' プリンタの詳細な情報を設定
Declare Function Api_SetPrinter& Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal Command&)

' プリンタオブジェクトを閉じる
Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&)

Var Shared Combo1 As Object
Var Shared Check1 As Object
Var Shared Button1 As Object

Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Check1.Attach GetDlgItem("Check1") : Check1.SetFontSize 12
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

    'ローカルプリンタから検索(サーバー名 \\xxx 指定可)
    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 pi5(Returned - 1) As PRINTER_INFO_5

    For CT = 0 To Returned - 1

        'バッファから構造体1つ分を抜き取る
        MoveMemory pi5(CT), Buffer(CT * Len(pi5(CT))), Len(pi5(CT))

        'プリンタ名を得る
        PrinterName = String$(MAX_DEVICENAME, Chr$(0))
        MoveMemory PrinterName, ByVal pi5(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 PrinterDeviceName As String
    Var pd As PRINTER_DEFAULTS
    Var pi5 As PRINTER_INFO_5
    Var hPrinter As Long
    Var Level As Long
    Var Needed As Long
    Var Ret As Long

    'プリンタ名を指定
    PrinterDeviceName = Combo1.GetWindowText

    'プリンタアクセス権を指定
    pd.DesiredAccess = PRINTER_ALL_ACCESS

    'プリンタのオブジェクトハンドルを取得
    Ret = Api_OpenPrinter(PrinterDeviceName, hPrinter, pd)

    '構造体のレベルを指定
    Level = 5

    'バッファに必要なサイズを取得
    Ret = Api_GetPrinter(hPrinter, Level, ByVal 0, 0, Needed)

    'バッファを確保
    Var Buffer(Needed - 1) As Byte

    '詳細なプリンタ情報を取得
    Ret = Api_GetPrinter(hPrinter, Level, Buffer(0), Needed, Needed)

    '取得した詳細なプリンタ情報を構造体へ移動
    MoveMemory pi5, Buffer(0), Len(pi5)

    '設定する条件によって分岐
    Select Case Check1.GetCheck
        '指定する
        Case 1
            '属性との論理和を指定
            pi5.Attributes = pi5.Attributes Or PRINTER_ATTRIBUTE_ENABLE_DEVQ

        '指定しない
        Case 0
            '属性との排他的論理和を指定
            pi5.Attributes = pi5.Attributes Xor PRINTER_ATTRIBUTE_ENABLE_DEVQ
    End Select

    '詳細なプリンタ情報を設定
    Ret = Api_SetPrinter(hPrinter, Level, pi5, 0)

    'プリンタオブジェクトをクローズ
    Ret = Api_ClosePrinter(hPrinter)
End Sub

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