-PR-

締切り済みの質問

質問No.2666719
困ってます
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数3
閲覧数3438
VB6でのプリンタ設定について
メモ帳等のように通常使うプリンタを変更することなく、アプリが起動している間は
任意のプリンタを選択することが出来、アプリ専用のプリンタ設定を保持するには
どうしたらいいでしょう。

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

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

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

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

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

VB6
XP SP2
投稿日時 - 2007-01-14 23:02:03

回答 (3)

回答No.3
>変えないようにも出来るのでしょうか?

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

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

アプリ起動時に現在の設定を記憶、変更して、印刷終了時に元に戻す
※この方法はアプリが異常終了などのトラブルがあった場合対処出来ません。
投稿日時 - 2007-01-17 12:30:08
この回答を支持する
(現在0人が支持しています)
補足
下記のサイトからダウンロードした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
お礼
ありがとうございます、もう少しトライしてみます。
投稿日時 - 2007-01-17 23:03:51
回答No.2
なるほど、そういう事ですか・・・(あやしいけど)

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

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

ただ、一度だけ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
投稿日時 - 2007-01-16 22:02:01
この回答を支持する
(現在0人が支持しています)
お礼
回答ありがとうございます。

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

私のコードももう少し整理が出来たら書き込みますので、そのときは
よろしくお願いします。
投稿日時 - 2007-01-17 00:51:32
回答No.1
今一つ理解しかねますが・・・

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

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

VBのダイアログでは、用紙の向きなど基本的なものは反映されますが、
プリンタ固有の情報は設定も変更も反映されません。
プリンタの切り替えなどをする場合、APIを利用するのが一般的です。
投稿日時 - 2007-01-15 20:16:56
この回答を支持する
(現在0人が支持しています)
補足
わかりづらい文章ですみませんでした。
改めて質問いたします。

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

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

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

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

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

よろしくお願いします。
投稿日時 - 2007-01-16 01:03:08
この質問は役に立ちましたか?
1人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

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

回答募集中

  • answer

    作成日の挿入Access2010を使用しています。 エクスポートするExcelファイルに画像のような作成...

  • answer

    削除が実行されない以下のvbsを実行しても rmdir が実行されません どうしたらよいでしょうか Dim o...

  • answer

    VB.NETからのExcel出力について現在、Windowsアプリの移行作業を行っています。  旧環境は以下の通りです。   ・Wi...

同じカテゴリの人気Q&Aランキング

カテゴリ
Visual Basic
-PR-
-PR-

特集

背筋がゾクゾクする心霊体験を要チェック!

お城、ボート、ツリーハウス、ユニークな物件満載!

【期間限定】1ヶ月無料キャンペーン中!

このQ&Aの関連キーワード

同じカテゴリの人気Q&Aランキング

カテゴリ
Visual Basic
-PR-

ピックアップ

-PR-