プリンタの詳細情報を取得 <TOP>
OpenPrinter プリンタオブジェクトをオープン
GetPrinter プリンタの詳細な情報を取得
ClosePrinter プリンタオブジェクトを閉じる
MoveMemory メモリの指定領域をコピー
指定されたプリンタのプロパティで設定されている情報を取得しています。
ここでのプリンタ名(PrtDevName)は、直接指定しています。接続されているプリンタ名の取得は、「プリンタの固有情報を取得」を参照してください。
'================================================================ '= プリンタの詳細情報を取得
'= (GetPrinter.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_DIRECT &H2 '直接データを送る #define PRINTER_ATTRIBUTE_ENABLE_BIDI &H800 '双方向通信 #define PRINTER_ATTRIBUTE_ENABLE_DEVQ &H80 '一致しないドキュメントの保留 #define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS &H100 '印刷後ドキュメントを残す #define PRINTER_ATTRIBUTE_SHARED &H8 '共有 ' プリンタオブジェクトをオープン 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 Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&) ' メモリの指定領域をコピー Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&) Var Shared Text1 As Object Var Shared Text2 As Object Var Shared Button1 As Object Var Shared Combo1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14 Var Shared PrtDevName As String '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() 'プリンタ名を指定 PrtDevName = "KONICA MINOLTA magicolor 2400W" 'Printer.DeviceName Text1.SetWindowText PrtDevName Combo1.AddString "PRINTER_ATTRIBUTE_DIRECT" Combo1.AddString "PRINTER_ATTRIBUTE_ENABLE_BIDI" Combo1.AddString "PRINTER_ATTRIBUTE_ENABLE_DEVQ" Combo1.AddString "PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS" Combo1.AddString "PRINTER_ATTRIBUTE_SHARED" End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var pd As PRINTER_DEFAULTS Var hPrinter As Long Var Level5 As Long Var Need As Long Var pi5 As PRINTER_INFO_5 Var Flg As Integer Var Ret As Long 'プリンタアクセス権を指定 pd.DesiredAccess = PRINTER_ALL_ACCESS 'プリンタのオブジェクトハンドルを取得 Ret = Api_OpenPrinter(PrtDevName, hPrinter, pd) '構造体のレベルを指定 Level5 = 5 'バッファに必要なサイズを取得 Ret = Api_GetPrinter(hPrinter, Level5, ByVal 0, 0, Need) 'バッファを確保 Var Buffer(Need - 1) As Byte '詳細なプリンタ情報を取得 Ret = Api_GetPrinter(hPrinter, Level5, Buffer(0), Need, Need) '取得した詳細なプリンタ情報を構造体へ移動 MoveMemory pi5, Buffer(0), Len(pi5) Flg = Combo1.GetCursel Select Case Flg '直接データを送る Case 0 If pi5.Attributes And PRINTER_ATTRIBUTE_DIRECT Then Text2.SetWindowText "「直接データを送る」が指定されています。" Else Text2.SetWindowText "「直接データを送る」が指定されていません。" End If '双方向通信 Case 1 If pi5.Attributes And PRINTER_ATTRIBUTE_ENABLE_BIDI Then Text2.SetWindowText "「双方向通信」が指定されています。" Else Text2.SetWindowText "「双方向通信」が指定されていません。" End If '一致しないドキュメントの保留 Case 2 If pi5.Attributes And PRINTER_ATTRIBUTE_ENABLE_DEVQ Then Text2.SetWindowText "「ドキュメントの保留」が指定されています。" Else Text2.SetWindowText "「ドキュメントの保留」が指定されていません。" End If '印刷後ドキュメントを残す Case 3 If pi5.Attributes And PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS Then Text2.SetWindowText "「印刷後ドキュメントを残す」が指定されています。" Else Text2.SetWindowText "「印刷後ドキュメントを残す」が指定されていません。" End If '共有 Case 4 If pi5.Attributes And PRINTER_ATTRIBUTE_SHARED Then Text2.SetWindowText "「共有」が指定されています。" Else Text2.SetWindowText "「共有」が指定されていません。" End If Case Else Text2.SetWindowtext "ComboBoxの項目を選択してください" End Select 'プリンタオブジェクトをクローズ Ret = Api_ClosePrinter(hPrinter) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End