プリンター設定ダイアログボックスを表示
                                                      玄関へお回り下さい。
プリンター設定ダイアログボックスを表示(APIを使って)その1        (115)
     Option Explicit

'プリンター設定ダイアログボックスを表示する(P634)
Private Declare Function PrinterProperties Lib "winspool.drv" _
    (ByVal hWnd As Long, ByVal hPrinter As Long) As Long
'プリンターあるいはプリントサーバーのハンドルを取得する(P633)
Private Declare Function OpenPrinter Lib "winspool.drv" _
    Alias "OpenPrinterA" (ByVal pPrinterName As String, _
    phPrinter As Long, pDefault As Any) As Long
'プリンターオブジェクトをクローズする(P596)
Private Declare Function ClosePrinter Lib "winspool.drv" _
    (ByVal hPrinter As Long) As Long


Private Sub Form_Load()
'プリンターの一覧を列挙
  On Error Resume Next
  Dim objPrinter As Printer
  'プリンターの一覧を取得
  For Each objPrinter In Printers
    cboPriSet.AddItem objPrinter.DeviceName
  Next
  '通常使うプリンターを表示
  cboPriSet.Text = Printer.DeviceName
  '現在のプリンターの情報を表示
  lblPriName.Caption = "種類: " & Printer.DeviceName
  lblPriport.Caption = "場所: " & Printer.Port
End Sub


Private Sub cmdPriProperty_Click()
'プロパティのボタン
  On Error Resume Next
  Dim Ret As Long
  Dim hPrinter As Long
  'プリンターのハンドルを取得する
  Ret = OpenPrinter(cboPriSet.Text, hPrinter, ByVal 0&)
  If hPrinter = 0 Then Exit Sub
  'プリンター設定ダイアログボックスを表示
  Ret = PrinterProperties(Me.hWnd, hPrinter)
  'プリンターオブジェクトをクローズ
  Ret = ClosePrinter(hPrinter)
End Sub


Private Sub cboPriSet_Click()
'ラベルに情報を再表示する為に選択したプリンターをセット
  Dim strMyPrinter As String
  Dim objPrinter As Printer
  strMyPrinter = cboPriSet.Text
  For Each objPrinter In Printers
    '選択したプリンターが見つかったら
    If objPrinter.DeviceName = strMyPrinter Then
      'オブジェクトに代入
      Set Printer = objPrinter
    End If
  Next
  '現在のプリンターの情報を表示
  lblPriName.Caption = "種類: " & Printer.DeviceName
  lblPriport.Caption = "場所: " & Printer.Port
End Sub


Private Sub cmdPrintCancel_Click()
'キャンセルのボタン
  Form1.Show
  Unload Me
End Sub


Private Sub cmdPrintOK_Click()
'OKのボタン
  Form1.Show
  Unload Me
End Sub



サンプル上のForm1の部分

Option Explicit

Private Sub mnufileExit_Click()
  Unload Me
End Sub

Private Sub mnuFilePrint_Click()
'印刷のメニュー
  Printer.Print "テスト印刷"
  Printer.EndDoc
End Sub

Private Sub mnuFilePrintSetup_Click()
'プリンター設定のメニュー
  frmPrintrSetUP.Show , Me
End Sub


 
  実行結果
  


こちらは、Win2000 以降(XP 含む)ではプロパティが違うものが表示されます。
その場合は、下記の方法を試して下さい。
プリンター設定ダイアログボックスを表示(APIを使って)その2        (122)
     Option Explicit  'SampleNo=122 VB6.0(SP5) 2002.03.14

Private Const PRINTACTION_PROPERTIES = 1& 'プロパティを表示
'その他のアクション
       'PRINTACTION_OPEN = 0
       'PRINTACTION_NETINSTALL = 2
       'PRINTACTION_NETINSTALLLINK = 3
       'PRINTACTION_TESTPAGE = 4
       'PRINTACTION_OPENNETPRN = 5
       'PRINTACTION_DOCUMENTDEFAULTS = 6
       'PRINTACTION_SERVERPROPERTIES = 7

'プリンターのプロパティ取得等のコマンドを実行する関数
Private Declare Function SHInvokePrinterCommand Lib "Shell32.dll" _
  Alias "SHInvokePrinterCommandA" (ByVal hwnd As Long, _
  ByVal uAction As Long, ByVal lpBuf1 As String, _
  ByVal lpBuf2 As String, ByVal fModal As Long) As Long


Private Sub Command1_Click()
  Dim lngRet    As Long
  Dim strMyPrinter As String
  '選択されているプリンター名を取得
  strMyPrinter = Combo1.Text
  'プリンターのプロパティを表示
  lngRet = SHInvokePrinterCommand(Me.hwnd, _
      PRINTACTION_PROPERTIES, strMyPrinter, vbNullString, 1)
End Sub


Private Sub Combo1_Click()
'プリンターが変更されたら
  Dim objPrinter  As Printer
  Dim strMyPrinter As String
  '選択されているプリンター名を取得
  strMyPrinter = Combo1.Text
  '使用可能プリンターを調べ
  For Each objPrinter In Printers
    '見つかったら
    If objPrinter.DeviceName = strMyPrinter Then
      'オブジェクトに代入
      Set Printer = objPrinter
    End If
  Next
End Sub


Private Sub Form_Load()
  Dim objPrinter As Printer
  'プリンターの一覧を取得
  For Each objPrinter In Printers
    Combo1.AddItem objPrinter.DeviceName
  Next
  '通常使うプリンターを表示
  Combo1.Text = Printer.DeviceName
End Sub


 実行結果(WindowsXP)
 
単に、プリンターダイアログを表示させるだけなら、コモンダイアログを使えば簡単なのだが、出来たソフトを配布するとなると別です。 COMDLG32.OCXも配布しないといけないし、バージョンの違い等の問題が発生したり、又その分130KB以上サイズが大きくなったりと問題がでてきます。そこで、コモンダイアログを使わずに、APIを使って表示するようにしました。
Windows2000やXPではコモンダイアログでは設定が反映されませんが、上記APIを使った方法
なら設定が有効になります。



2002/05/02