[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/12/06(Wed) 20:11
投稿者名:太郎
Eメール:
URL :
タイトル:
DEVMODE構造体で、プリンタ固有の情報の取得及び設定
はじめまして、太郎です。

フォーム上から、SHInvokePrinterCommandやPrinterProperties()でプリンタの印刷設定ダイ
アログを表示し、印刷設定を変更します。そして、フォーム上の印刷ボタンを押し、印刷終
了後に元の設定に戻そうとしています。

そこで、印刷設定の変更前に、GetprinterでDEVMODE構造体をいったん変数に保存しまし
た(1)。そして、印刷終了後、Setprinterを使い、保存した変数をDEVMODE構造体に代入し
元に戻しました(2)。

ですが、DEVMODE構造体にない情報(プリンタ独自の情報)は設定を保存したり(1)、変更
前に戻せませんでした(2)。どのようにすれば、可能になるでしょうか?

宜しくお願いします。
※環境は、VB6.0 SP6 WindowsXPです。

/////////////////////////////////////////////////////////////////////////////
Sub 印刷設定の取得()

    ' プリンタ名指定する
    strPrinterDeviceName = Combo1.Text

    ' プリンタのオブジェクトハンドルを取得する
    lngResult =  OpenPrinter( strPrinterDeviceName, lngPrinterHandle, _
            udtPrinterDefaults)
    ' 構造体のレベルを指定する
    lngPrinterInfo2Level = 2

    ' バッファに必要なサイズを取得する
    lngResult = _
        GetPrinter( _
            lngPrinterHandle, _
            lngPrinterInfo2Level, _
            ByVal vbNullString, _
            0, _
            lngPrinterInfo2Needed)
    ' バッファを確保する
    ReDim  bytPrinterInfo2Buffer  (lngPrinterInfo2Needed - 1)

    ' 詳細なプリンタ情報を取得する
    lngResult = _
        GetPrinter( _
            lngPrinterHandle, _
            lngPrinterInfo2Level, _
            bytPrinterInfo2Buffer(0), _
            lngPrinterInfo2Needed, _
            lngPrinterInfo2Needed)
    ' 取得した詳細なプリンタ情報を構造体へ移動する
    MoveMemory _
        udtPrinterInfo2, _
        bytPrinterInfo2Buffer(0), _
        Len(udtPrinterInfo2)

    ' 取得した詳細なプリンタデバイス情報を構造体へ移動する
    MoveMemory _
        udtDevMode, _
        ByVal udtPrinterInfo2.pDevMode, _
        Len(udtDevMode)
        
    '------------------------------------------------------------------
    '【印刷設定を表示する前にDevmode構造体を一度変数に保存】
    '・・・@DEVMODE構造体にない情報(プリンタ独自の情報)が保存できません
    '------------------------------------------------------------------
    With udtDevMode
        SpecVersion = .dmSpecVersion
        DriverVersion = .dmDriverVersion
        Size = .dmSize
        DriverExtra = .dmDriverExtra
        Fields = .dmFields
        Orientation = .dmOrientation
        PaperSize = .dmPaperSize
    ・・・
    End With

    
End Sub
Sub 印刷設定の変更()

  ・・・

    '------------------------------------------------------------------
    '【印刷終了後、@で保存した変数をDevmode構造体に戻す】
    '・・・ADEVMODE構造体にない情報(プリンタ独自の情報)が設定できません。
    '------------------------------------------------------------------
    With udtDevMode
        ' 用紙が指定できるときは
        If .dmFields And DM_PAPERSIZE Then

            
            '.dmDeviceName = DeviceName
            .dmSpecVersion = SpecVersion
            .dmDriverVersion = DriverVersion
            .dmSize = Size
            .dmDriverExtra = DriverExtra
            .dmFields = Fields
            .dmOrientation = Orientation
            .dmPaperSize = PaperSize
            ・・・

            ' 構造体を取得した詳細なプリンタデバイス情報へ移動する
            MoveMemory _
                ByVal udtPrinterInfo2.pDevMode, _
                udtDevMode, _
                Len(udtDevMode)
            '詳細なプリンタ情報を書き戻し
            lngResult = _
                SetPrinter( _
                    lngPrinterHandle, _
                    lngPrinterInfo2Level, _
                    udtPrinterInfo2, _
                    0)
        End If
    End With
    ' プリンタオブジェクトをクローズ
    lngResult = ClosePrinter(lngPrinterHandle)

End Sub

投稿時間:2006/12/07(Thu) 10:31
投稿者名:K.J.K.
Eメール:
URL :
タイトル:
Re: DEVMODE構造体で、プリンタ固有の情報の取得及び設定
難しく考えずに、印刷設定の取得のところで得た
bytPrinterInfo2Buffer
をそのまま保持しておき、それを用いて復元すればいいのでは。

# コードを提示するときは、変数の宣言部なども省略しないように。

投稿時間:2006/12/07(Thu) 14:08
投稿者名:太郎
Eメール:
URL :
タイトル:
Re^2: DEVMODE構造体で、プリンタ固有の情報の取得及び設定
K.J.K.さん。
おっしゃるとおり、下記のように、SetPrinterで、bytPrinterInfo2Bufferを復元するだけで
解決しました。
とても助かりました。

それから、宣言部も今後省略しないようにします。
どうもありがとうございました。



修正版
//////////////////////////////////////////////////////////////////////
'宣言
    Dim strPrinterDeviceName    As String
    Dim udtPrinterDefaults      As PRINTER_DEFAULTS
    Dim lngPrinterHandle        As Long
    Dim lngPrinterInfo2Level    As Long
    Dim lngPrinterInfo2Needed   As Long
    Dim bytPrinterInfo2Buffer() As Byte
    Dim udtPrinterInfo2         As PRINTER_INFO_2
    Dim lngResult               As Long


/////////////////////////////////////////////////////////////////////////////
Sub 印刷設定の取得()

    ' プリンタ名指定する
    strPrinterDeviceName = Combo1.Text

    ' プリンタのオブジェクトハンドルを取得する
    lngResult =  OpenPrinter( strPrinterDeviceName, lngPrinterHandle, _
            udtPrinterDefaults)
    ' 構造体のレベルを指定する
    lngPrinterInfo2Level = 2

    ' バッファに必要なサイズを取得する
    lngResult = _
        GetPrinter( _
            lngPrinterHandle, _
            lngPrinterInfo2Level, _
            ByVal vbNullString, _
            0, _
            lngPrinterInfo2Needed)
    ' バッファを確保する
    ReDim  bytPrinterInfo2Buffer  (lngPrinterInfo2Needed - 1)

    ' 詳細なプリンタ情報を取得する
    lngResult = _
        GetPrinter( _
            lngPrinterHandle, _
            lngPrinterInfo2Level, _
            bytPrinterInfo2Buffer(0), _
            lngPrinterInfo2Needed, _
            lngPrinterInfo2Needed)
    ' 取得した詳細なプリンタ情報を構造体へ移動する
    MoveMemory _
        udtPrinterInfo2, _
        bytPrinterInfo2Buffer(0), _
        Len(udtPrinterInfo2)

  
End Sub
/////////////////////////////////////////////////////////////////////////////
Sub 印刷設定の変更()


            '詳細なプリンタ情報を書き戻し
            lngResult = _
                SetPrinter( _
                    lngPrinterHandle, _
                    lngPrinterInfo2Level, _
                    udtPrinterInfo2, _
                    0)


End Sub