プリンタのオンライン・オフライン切替          <TOP>


通常使うプリンタを「オンライン・オフライン」で使用するかを切り替えます。

OpenPrinter プリンタオブジェクトをオープン

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

MoveMemory メモリの指定領域をコピー

SetPrinter プリンタの詳細な情報を設定

ClosePrinter プリンタオブジェクトを閉じる

 

 

'================================================================
'= プリンタのオンライン・オフライン切替
'=    (PrinterOffline.bas)
'================================================================
#include "Windows.bi"

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

Type PRINTER_INFO_2
    pServerName         As Long
    pPrinterName        As Long
    pShareName          As Long
    pPortName           As Long
    pDriverName         As Long
    pComment            As Long
    pLocation           As Long
    pDevMode            As Long
    pSepFile            As Long
    pPrintProcessor     As Long
    pDatatype           As Long
    pParameters         As Long
    pSecurityDescriptor As Long
    Attributes          As Long
    Priority            As Long
    DefaultPriority     As Long
    StartTime           As Long
    UntilTime           As Long
    Status              As Long
    cJobs               As Long
    AveragePPM          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_WORK_OFFLINE &H400       'プリンタがオフライン

' プリンタオブジェクトをオープン
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&, pcbNeeded&)

' メモリの指定領域をコピー
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 Button1 As Object

Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Combo1.AddString "オフライン"
    Combo1.AddString "オンライン"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var PrtDevName As String
    Var pd As PRINTER_DEFAULTS
    Var hPrinter As Long
    Var Level As Long
    Var Need As Long
    Var pi2 As PRINTER_INFO_2
    Var Ret As Long

    'プリンタ名を指定
    PrtDevName = "KONICA MINOLTA magicolor 2400W"    'Printer.DeviceName

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

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

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

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

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

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

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

    'オフライン設定が選択されているとき
    If Combo1.GetWindowText = "オフライン" Then
        'オフライン属性を設定
        pi2.Attributes = PRINTER_ATTRIBUTE_WORK_OFFLINE

    'オフライン設定が選択されていないとき
    Else
        'オフライン属性を解除
        pi2.Attributes = pi2.Attributes Xor PRINTER_ATTRIBUTE_WORK_OFFLINE
    End If

    '詳細なプリンタ情報を書き戻し
    Ret = Api_SetPrinter(hPrinter, Level, pi2, 0)

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

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