- 締切済み
VB6でのプリンタ設定について
メモ帳等のように通常使うプリンタを変更することなく、アプリが起動している間は 任意のプリンタを選択することが出来、アプリ専用のプリンタ設定を保持するには どうしたらいいでしょう。 1.OpenPrinter 2.GetPrinter で PRINTER_INFO_2 から DEVMODE を取得 3.DEVNAMES を設定 4.PRINTDLG で設定画面を表示 上記の手順でプリントダイアログを表示するとこまでは出来ましたが ここで設定された情報を Printer オブジェクトに反映させる方法がわかりません。 ResetDC だと色、用紙の向きなど基本的なものは反映されましたがプリンタ固有の 情報(スタンプマークなど)までは反映されませんでした。 SetPrinter だとすべての情報が反映されましたが通常使うプリンタの設定まで 変わってしまいました。 わかりづらい部分が多々あるとは思いますが、どなたか教えていただけませんでしょうか よろしくお願いします。 VB6 XP SP2
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kiki_s
- ベストアンサー率59% (147/248)
>変えないようにも出来るのでしょうか? APIで一時的に変更出来るかは分かりません。 しかし方法は色々あると思います。 例えば・・・ 印刷時に現在の設定を記憶、変更して、印刷終了時に元に戻す (プリンタ設定を表示させずに変更する) ※この方法は可能かどうかです アプリ起動時に現在の設定を記憶、変更して、印刷終了時に元に戻す ※この方法はアプリが異常終了などのトラブルがあった場合対処出来ません。
- kiki_s
- ベストアンサー率59% (147/248)
なるほど、そういう事ですか・・・(あやしいけど) つまり、プリンタ機種の変更ではなく 設定を変更して、再度プリンタ設定を開いた時、 変更された内容で表示出来るかと。 これは私も経験がありません。 また、コードもどのように書かれているか分かりませんので、 アドバイスする自信もありません。 ただ、一度だけ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
お礼
回答ありがとうございます。 サンプルを試してみたところ何度でも指定したとおりに表示されました。 しかしこの方法だと通常使うプリンタの設定も変わってしまうのですね。 変えないようにも出来るのでしょうか? 私のコードももう少し整理が出来たら書き込みますので、そのときは よろしくお願いします。
- kiki_s
- ベストアンサー率59% (147/248)
今一つ理解しかねますが・・・ 勝手に解釈してみましたが、 要は、作成したアプリが起動した時点で、 使用するプリンタを切り替えるという事でしょうか? 通常(プリンタA) アプリ起動(プリンタAからB) アプリ終了(プリンタBからA) VBのダイアログでは、用紙の向きなど基本的なものは反映されますが、 プリンタ固有の情報は設定も変更も反映されません。 プリンタの切り替えなどをする場合、APIを利用するのが一般的です。
補足
わかりづらい文章ですみませんでした。 改めて質問いたします。 通常使うプリンタの設定がA4縦とします。 メモ帳を起動して「ページ設定」「プリンタの設定」「プロパティ」の 順でクリックするとプリンタの設定画面が表示されます。 ここで用紙サイズをB5、印刷方向を横に変更してすべてのダイアログを閉じます。 再度、同じ行程をたどるとプリンタの設定画面には先ほど設定したとおり 用紙サイズはB5、印刷方向は横と表示されます。 メモ帳を終了するまでこの設定は保持されているようです。 これと同じことをしようと下記のようにしてみました。 しかし、設定画面を表示するとこまでは出来ましたがその後がわかりません。 OpenPrinter関数でプリンタのハンドルを取得して GetPrinter関数でPRINTER_INFO_2構造体を取得する そこからさらにDEVMODE構造体を取得する DEVNAMES構造体を設定して PRINTDLG関数でプリンタの設定画面を表示する 設定を変更して閉じる 再度、PRINTDLG関数でプリンタの設定画面を表示する場合 どのようにすれば先ほど設定したものとまったく同じもの を表示出来るのでしょうか? よろしくお願いします。
お礼
ありがとうございます、もう少しトライしてみます。
補足
下記のサイトからダウンロードした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