-PR-
noname#63886

メモ帳等のように通常使うプリンタを変更することなく、アプリが起動している間は
任意のプリンタを選択することが出来、アプリ専用のプリンタ設定を保持するには
どうしたらいいでしょう。

1.OpenPrinter
2.GetPrinter で PRINTER_INFO_2 から DEVMODE を取得
3.DEVNAMES を設定
4.PRINTDLG で設定画面を表示

上記の手順でプリントダイアログを表示するとこまでは出来ましたが
ここで設定された情報を Printer オブジェクトに反映させる方法がわかりません。

ResetDC だと色、用紙の向きなど基本的なものは反映されましたがプリンタ固有の
情報(スタンプマークなど)までは反映されませんでした。

SetPrinter だとすべての情報が反映されましたが通常使うプリンタの設定まで
変わってしまいました。

わかりづらい部分が多々あるとは思いますが、どなたか教えていただけませんでしょうか
よろしくお願いします。

VB6
XP SP2
  • 回答数3
  • 気になる数0
  • Aみんなの回答(全3件)

    回答 (全3件)

    • 2007-01-15 20:16:56
    • 回答No.1
    今一つ理解しかねますが・・・ 勝手に解釈してみましたが、 要は、作成したアプリが起動した時点で、 使用するプリンタを切り替えるという事でしょうか? 通常(プリンタA) アプリ起動(プリンタAからB) アプリ終了(プリンタBからA) VBのダイアログでは、用紙の向きなど基本的なものは反映されますが、 プリンタ固有の情報は設定も変更も反映されません。 プリンタの切り替えなどをする ...続きを読む
    今一つ理解しかねますが・・・

    勝手に解釈してみましたが、
    要は、作成したアプリが起動した時点で、
    使用するプリンタを切り替えるという事でしょうか?

    通常(プリンタA)
    アプリ起動(プリンタAからB)
    アプリ終了(プリンタBからA)

    VBのダイアログでは、用紙の向きなど基本的なものは反映されますが、
    プリンタ固有の情報は設定も変更も反映されません。
    プリンタの切り替えなどをする場合、APIを利用するのが一般的です。
    補足コメント
    noname#63886

    わかりづらい文章ですみませんでした。
    改めて質問いたします。

    通常使うプリンタの設定がA4縦とします。
    メモ帳を起動して「ページ設定」「プリンタの設定」「プロパティ」の
    順でクリックするとプリンタの設定画面が表示されます。
    ここで用紙サイズをB5、印刷方向を横に変更してすべてのダイアログを閉じます。

    再度、同じ行程をたどるとプリンタの設定画面には先ほど設定したとおり
    用紙サイズはB5、印刷方向は横と表示されます。
    メモ帳を終了するまでこの設定は保持されているようです。

    これと同じことをしようと下記のようにしてみました。
    しかし、設定画面を表示するとこまでは出来ましたがその後がわかりません。

    OpenPrinter関数でプリンタのハンドルを取得して
    GetPrinter関数でPRINTER_INFO_2構造体を取得する
    そこからさらにDEVMODE構造体を取得する
    DEVNAMES構造体を設定して
    PRINTDLG関数でプリンタの設定画面を表示する
    設定を変更して閉じる

    再度、PRINTDLG関数でプリンタの設定画面を表示する場合
    どのようにすれば先ほど設定したものとまったく同じもの
    を表示出来るのでしょうか?

    よろしくお願いします。
    投稿日時 - 2007-01-16 01:03:08
    • ありがとう数0
    • 2007-01-16 22:02:01
    • 回答No.2
    なるほど、そういう事ですか・・・(あやしいけど) つまり、プリンタ機種の変更ではなく 設定を変更して、再度プリンタ設定を開いた時、 変更された内容で表示出来るかと。 これは私も経験がありません。 また、コードもどのように書かれているか分かりませんので、 アドバイスする自信もありません。 ただ、一度だけAPIを利用してプリンタの設定を変更、反映の部分を、 色々なサンプルコードなど ...続きを読む
    なるほど、そういう事ですか・・・(あやしいけど)

    つまり、プリンタ機種の変更ではなく
    設定を変更して、再度プリンタ設定を開いた時、
    変更された内容で表示出来るかと。

    これは私も経験がありません。
    また、コードもどのように書かれているか分かりませんので、
    アドバイスする自信もありません。

    ただ、一度だけAPIを利用してプリンタの設定を変更、反映の部分を、
    色々なサンプルコードなどを利用して組み立てた事はあります。
    今でも、そのソフトは仕事で使っていますが、
    プリンタ設定では変更した内容が表示されます。
    ただし、ソフトを終了しても、通常使うプリンタの設定はそのままです。

    試しに書き出してみたら動きました。
    エラー処理などはありません。
    strMyPrinterにプリンタ名が入ります。
    参考になれば良いのですが・・・


    'General
    '========================================================

    Option Explicit

    '関数の宣言
    Private Declare Function GetVersion Lib "Kernel32.dll" () As Long
    Private Declare Function WriteProfileString Lib "Kernel32.dll" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
    Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

    Const HWND_BROADCAST = &HFFFF&
    Const WM_WININICHANGE = &H1A

    'プロパティを表示
    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 = "CanonLBP-1420(LAN)"

    lngRet = SHInvokePrinterCommand(Me.hwnd, PRINTACTION_PROPERTIES, strMyPrinter, vbNullString, 1)

    End Sub
    お礼コメント
    noname#63886

    回答ありがとうございます。

    サンプルを試してみたところ何度でも指定したとおりに表示されました。
    しかしこの方法だと通常使うプリンタの設定も変わってしまうのですね。
    変えないようにも出来るのでしょうか?

    私のコードももう少し整理が出来たら書き込みますので、そのときは
    よろしくお願いします。
    投稿日時 - 2007-01-17 00:51:32
    • ありがとう数0
    • 2007-01-17 12:30:08
    • 回答No.3
    >変えないようにも出来るのでしょうか? APIで一時的に変更出来るかは分かりません。 しかし方法は色々あると思います。 例えば・・・ 印刷時に現在の設定を記憶、変更して、印刷終了時に元に戻す (プリンタ設定を表示させずに変更する) ※この方法は可能かどうかです アプリ起動時に現在の設定を記憶、変更して、印刷終了時に元に戻す ※この方法はアプリが異常終了などのトラブルがあっ ...続きを読む
    >変えないようにも出来るのでしょうか?

    APIで一時的に変更出来るかは分かりません。
    しかし方法は色々あると思います。

    例えば・・・
    印刷時に現在の設定を記憶、変更して、印刷終了時に元に戻す
    (プリンタ設定を表示させずに変更する)
    ※この方法は可能かどうかです

    アプリ起動時に現在の設定を記憶、変更して、印刷終了時に元に戻す
    ※この方法はアプリが異常終了などのトラブルがあった場合対処出来ません。
    補足コメント
    noname#63886

    下記のサイトからダウンロードしたPrinterModule.basとWin32API.basを使用して
    プリント機能を実現することが出来ました。
    http://www.itmedia.co.jp/help/howto/win/win2000/0007complus_vb/chap07/65.html

    もうかなり前のことで申し訳ないのですが、おかしな箇所がありましたら
    アドバイスしてもらえませんでしょうか?よろしくお願いします。

    ソースコードは下記の通りです。

    'Form1
    Option Explicit

    Private Sub Command1_Click()

    Dim ret As Long

      ret = PrintSetup2(PD_PRINTSETUP, Me.hWnd)
    End Sub

    Private Sub Command2_Click()

    Dim ret As Long

      ret = PrintSetup2(0, Me.hWnd)

      If ret = True Then
        Printer.ForeColor = vbRed
        Printer.Print "ABCDEFG"
        Printer.EndDoc
      End If
    End Sub

    'Module1
    Option Explicit

    Public Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" (ByVal hdc As Long, lpInitData As Any) As Long
    Public Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, ByVal Dev As Long) As Long

    Public Const DC_SIZE = 8
    Public Const DC_EXTRA = 9

    Public vDevModeData() As Byte
    Public PrinterName As String
    Public NeedSize As Long

    Public Function PrintSetup2(ByVal Flags As Long, ByVal FormHwnd As Long) As Boolean

    Dim lpDevMode As Long
    Dim lpDevNames As Long
    Dim hDevMode As Long
    Dim hDevNames As Long
    Dim dmSize As Long
    Dim DmExSize As Long
    Dim Pri As Printer
    Dim ret As Long

    If PrinterName = "" Then

      For Each Pri In Printers
        dmSize = DeviceCapabilities(Pri.DeviceName, Pri.Port, DC_SIZE, ByVal vbNullString, 0)
        DmExSize = DeviceCapabilities(Pri.DeviceName, Pri.Port, DC_EXTRA, ByVal vbNullString, 0)

        If dmSize + DmExSize > NeedSize Then
          NeedSize = dmSize + DmExSize
        End If
      Next

      NeedSize = NeedSize + 100
      ReDim vDevModeData(0 To NeedSize - 1) As Byte

    Else
      hDevMode = GlobalAlloc(GHND, NeedSize)
      lpDevMode = GlobalLock(hDevMode)
      CopyMemory ByVal lpDevMode, vDevModeData(0), NeedSize
      GlobalUnlock hDevMode

      hDevNames = GlobalAlloc(GHND, Len(vDevNames))
      lpDevNames = GlobalLock(hDevNames)
      CopyMemory ByVal lpDevNames, vDevNames, Len(vDevNames)
      GlobalUnlock hDevNames
    End If

    vPrintDlg.lStructSize = Len(vPrintDlg)
    vPrintDlg.hwndOwner = FormHwnd
    vPrintDlg.hDevMode = hDevMode
    vPrintDlg.hDevNames = hDevNames
    vPrintDlg.Flags = Flags

    If PRINTDLG(vPrintDlg) <> 0 Then

      If vPrintDlg.hDevMode <> 0 Then
        lpDevMode = GlobalLock(vPrintDlg.hDevMode)
        CopyMemory vDevModeData(0), ByVal lpDevMode, NeedSize
        GlobalUnlock lpDevMode
        GlobalFree vPrintDlg.hDevMode
      End If

      If vPrintDlg.hDevNames <> 0 Then
        lpDevNames = GlobalLock(vPrintDlg.hDevNames)
        CopyMemory vDevNames, ByVal lpDevNames, Len(vDevNames)
        GlobalUnlock lpDevNames
        GlobalFree vPrintDlg.hDevNames
      End If

      PrinterName = Mid(vDevNames.extData, vDevNames.wDeviceOffset - 8 + 1)
      PrinterName = Left(PrinterName, InStr(PrinterName, Chr(0)) - 1)

      For Each Pri In Printers
        If UCase(Pri.DeviceName) = UCase(PrinterName) Then
          Set Printer = Pri
          Exit For
        End If
      Next

      ret = ResetDC(Printer.hdc, vDevModeData(0))
      If ret = 0 Then Exit Function

      PrintSetup2 = True

    Else
      PrintSetup2 = False
    End If

    End Function
    投稿日時 - 2007-01-31 01:34:48
    お礼コメント
    noname#63886

    ありがとうございます、もう少しトライしてみます。
    投稿日時 - 2007-01-17 23:03:51
    • ありがとう数0
    • 回答数3
    • 気になる数0
    • ありがとう数1
    • ありがとう
    • なるほど、役に立ったなど
      感じた思いを「ありがとう」で
      伝えてください
    • 質問する
    • 知りたいこと、悩んでいることを
      投稿してみましょう
    こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
    このQ&Aにはまだコメントがありません。
    あなたの思ったこと、知っていることをここにコメントしてみましょう。

    関連するQ&A

    -PR-
    -PR-

    その他の関連するQ&Aをキーワードで探す

    別のキーワードで再検索する
    -PR-
    -PR-
    -PR-

    特集


    成功のポイントとは?M&Aで経営の不安を解決!

    -PR-

    ピックアップ

    -PR-
    ページ先頭へ