• 締切済み

VB6でのプリンタ設定について

メモ帳等のように通常使うプリンタを変更することなく、アプリが起動している間は 任意のプリンタを選択することが出来、アプリ専用のプリンタ設定を保持するには どうしたらいいでしょう。 1.OpenPrinter 2.GetPrinter で PRINTER_INFO_2 から DEVMODE を取得 3.DEVNAMES を設定 4.PRINTDLG で設定画面を表示 上記の手順でプリントダイアログを表示するとこまでは出来ましたが ここで設定された情報を Printer オブジェクトに反映させる方法がわかりません。 ResetDC だと色、用紙の向きなど基本的なものは反映されましたがプリンタ固有の 情報(スタンプマークなど)までは反映されませんでした。 SetPrinter だとすべての情報が反映されましたが通常使うプリンタの設定まで 変わってしまいました。 わかりづらい部分が多々あるとは思いますが、どなたか教えていただけませんでしょうか よろしくお願いします。 VB6 XP SP2

noname#63886
noname#63886

みんなの回答

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.3

>変えないようにも出来るのでしょうか? APIで一時的に変更出来るかは分かりません。 しかし方法は色々あると思います。 例えば・・・ 印刷時に現在の設定を記憶、変更して、印刷終了時に元に戻す (プリンタ設定を表示させずに変更する) ※この方法は可能かどうかです アプリ起動時に現在の設定を記憶、変更して、印刷終了時に元に戻す ※この方法はアプリが異常終了などのトラブルがあった場合対処出来ません。

noname#63886
質問者

お礼

ありがとうございます、もう少しトライしてみます。

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

  • kiki_s
  • ベストアンサー率59% (147/248)
回答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

noname#63886
質問者

お礼

回答ありがとうございます。 サンプルを試してみたところ何度でも指定したとおりに表示されました。 しかしこの方法だと通常使うプリンタの設定も変わってしまうのですね。 変えないようにも出来るのでしょうか? 私のコードももう少し整理が出来たら書き込みますので、そのときは よろしくお願いします。

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.1

今一つ理解しかねますが・・・ 勝手に解釈してみましたが、 要は、作成したアプリが起動した時点で、 使用するプリンタを切り替えるという事でしょうか? 通常(プリンタA) アプリ起動(プリンタAからB) アプリ終了(プリンタBからA) VBのダイアログでは、用紙の向きなど基本的なものは反映されますが、 プリンタ固有の情報は設定も変更も反映されません。 プリンタの切り替えなどをする場合、APIを利用するのが一般的です。

noname#63886
質問者

補足

わかりづらい文章ですみませんでした。 改めて質問いたします。 通常使うプリンタの設定がA4縦とします。 メモ帳を起動して「ページ設定」「プリンタの設定」「プロパティ」の 順でクリックするとプリンタの設定画面が表示されます。 ここで用紙サイズをB5、印刷方向を横に変更してすべてのダイアログを閉じます。 再度、同じ行程をたどるとプリンタの設定画面には先ほど設定したとおり 用紙サイズはB5、印刷方向は横と表示されます。 メモ帳を終了するまでこの設定は保持されているようです。 これと同じことをしようと下記のようにしてみました。 しかし、設定画面を表示するとこまでは出来ましたがその後がわかりません。 OpenPrinter関数でプリンタのハンドルを取得して GetPrinter関数でPRINTER_INFO_2構造体を取得する そこからさらにDEVMODE構造体を取得する DEVNAMES構造体を設定して PRINTDLG関数でプリンタの設定画面を表示する 設定を変更して閉じる 再度、PRINTDLG関数でプリンタの設定画面を表示する場合 どのようにすれば先ほど設定したものとまったく同じもの を表示出来るのでしょうか? よろしくお願いします。

関連するQ&A

  • vbから印刷時に、プリンタの厚紙設定をしたい。

    出力先プリンタの切り替えや、用紙サイズや向きやトレイなどは設定できたのですが、 用紙の厚さ(普通紙なのか厚紙なのかなど)が設定できません。 どうしたらできるのでしょうか? おそらく、厚紙設定は、そのプリンタ固有の情報なのでvbに用意されている一般的なプロパティでは対応できず、そのプリンタのドライバとのやり取りが必要なのかな?となんとなく想像していますが、ネットで調べても、なかなか答えに結びつきません。 分かる方、お願いします。

  • VB6.0でのプリンタ設定について

    はじめまして。 現在VB6.0にて、プリンタダイアログを表示させずに、プリンタの変更~印刷を行うプログラムを作成しています。(とある印刷は別のプリンタで印刷のイメージです) 方法はWIN32APIとWMIの2通りがあるようですがなかなか作成することができません。 WIN32API使用に関しては特に??で勉強中です。 イメージの流れでは以下を考えています。 (1)通常使用プリンタのバックアップ (2)通常使用プリンタの変更 (3)印刷 (4)通常使用プリンタを戻す すいませんがご教授いただけませんでしょうか?

  • VB6でのネットワークプリンタ(OS:WInXP)に対する印刷

    ご存じの方がおられましたら教えていただきたいのですが・・・ 当方、VB6(SP6)でアプリを作成し印刷機能も作りました。 以前はWin2000からプリンタサーバー(Win2000につながっているプリンタ)に対してネットワーク印刷を行っていました。APIを使用して用紙方向等変更できてました。簡単な処理の流れとしては、 (1)現在選択されているプリンタの情報を取得し記憶しておく。 (2)用紙方向等の変更 (3)印刷 (4)記憶しておいた内容にプリンタを戻す と言う具合です。 ところが、社内環境がかわり、WinXPからプリンタサーバー(WinXPにつながったプリンタ)に対して上記の処理を行うとエラーが出力されます。 調べたところ、始めにOpenPrinter関数を呼んでいるのですがこの時点で戻り値が0(関数が失敗)が帰ってきています。 ソースは以下のような感じです(一部抜粋) ' 標準的な権利を要求することを示す定数の宣言 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 ' プリンタアクセス権の管理者権限を示す定数の宣言 Public Const PRINTER_ACCESS_ADMINISTER = &H4& ' プリンタアクセス権のユーザー権限を示す定数の宣言 Public Const PRINTER_ACCESS_USE = &H8& ' プリンタアクセス権すべての権限を示す定数の宣言 Public Const PRINTER_ALL_ACCESS = _ (STANDARD_RIGHTS_REQUIRED Or _ PRINTER_ACCESS_ADMINISTER Or _ PRINTER_ACCESS_USE) ' プリンタのオブジェクトハンドルを取得する関数の宣言 Declare Function OpenPrinter Lib "winspool.drv" _ Alias "OpenPrinterA" _ (ByVal pPrinterName As String, _ phPrinter As Long, _ pDefault As Any) As Long '**************************************************** '↓処理 ' プリンタ名を指定 strPrinterDeviceName = Printer.DeviceName ' プリンタアクセス権を指定 With udtPrinterDefaults .DesiredAccess = PRINTER_ALL_ACCESS End With ' プリンタのオブジェクトハンドルを取得 lngWin32apiResultCode = OpenPrinter(strPrinterDeviceName, lngPrinterHandle, udtPrinterDefaults) ↑ この変数の戻り値が0 試しに色々やってみました。 (1)WinXPからプリンタサーバー(OS:WinXP)  × (2)WinXPからプリンタサーバー(OS:Win2000)  ○ (3)プリンタサーバー(OS:WinXP)にアプリを ○ インストール後印刷 ※ローカルプリンタに対する印刷 うまくいかないのはプリンタサーバーがWinXPの時のみエラーが 出てしまうようです。 宜しくお願いします。

  • プリンターの設定

    EPSON PRINTER が3台あり 1台を通常使うプリンターに設定したい。 ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • エクセルファイルを開くと「プリンタの設定」ダイアログが出る

    Excel2003を使用しているのですが、 あるエクセルのファイルを開こうとすると、 「プリンタの設定」ダイアログが表示されます。 ダイアログの中には、現在インストールされているプリンタの一覧が表示されていて、通常使用しているプリンタを選択してOKしても何度も聞き返されてきます。 他のファイルはこういうことを聞かれないのになぜでしょう。 そもそも出なく出来ますでしょうか。

  • プリンタのプロパティ設定について

    プリンタのプロパティ設定について お世話になっております。 プリンタの詳細設定について、お聞きしたいのですが 「スタートメニュー」→「設定」→「プリンタとFAX」→ 任意のプリンタを選択し、右クリック「プロパティ」→ ポートタブへ移動して「ポートの構成」で設定する内容は どこのファイルで情報を保持していますか? レジストリでしょうか? それともWindowsのシステムで制御している プリンタ関連の設定ファイルなどで持っているのでしょうか? それともプリンタアプリ? レジストリのHKLM\SYSTEM\ControlSet001(003)、ControlSet\Print\Printers配下は 確認しましたが、わかりませんでした。 ご存知の方がいらっしゃいましたら、具体的なファイルや レジストリを教えてほしいです。また、参考となる文献など ございましたら紹介していただきたいです。

  • プリンタ設定ユーティリティが開かずプリンター設定ができません

    色々と調べても分からなかったので質問させていただきます。 先日iBookのOSプログラムが壊れてしまったので、OSの再インストールをした所 様々なアプリケーションソフトが使えなくなってしまいました。なので、 それらの使えなくなったソフトもインストールし直していたのですが、 何故かプリンターの設定だけがうまく行きません。 マックOSX10.3.9:使用プリンターはエプソンのPX-V630 です。 ネットからドライバをダウンロードしインストールしてもパソコンに プリンターが認識されず、ならばとプリンター設定をしようとすると、 “アプリケーション printer Setup Utility は予期せぬ理由で終了しました” と 表示されてしまいます。何か解決方法はありませんでしょうか…? また、何か説明不足な点がありましたら、ご指摘ください。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Mac
  • 通常使うプリンタの設定ができない

    一台のWindows Vistaマシンを家族2人で使用しています。 そのうち1人の方で「通常使うプリンタに設定」をしても有効になりません。 普通、「通常使うプリンタに設定」をすると設定したプリンタにチェックマークがつきますが、何度やってもチャックマークが付きません。 なお、もう1人の方では有効になっています。 ちなみに、通常使うプリンタに設定されていないだけで、印刷時にプリンタを選択できるWORDのようなアプリでは選択することで問題なく印刷できます。 しかし、通常使うプリンタが設定されていないと印刷できないEXCELなどは印刷できない状況です。 何か解決策をご存じないでしょうか?

  • Illustrator CS2の用紙設定について

    Illustrator CS2をMac OS10.3.9で使用しています。 プリンタはCanonのpostscriptプリンタです。 CS2からプリントの際のダイアログが変わり、 (CSからかもしれませんが、CSは使った事がないのでわかりません) 例えば「手差し」などの指定をする際に プリントダイアログ最下段の「プリンタ」をクリックし Illustrator10までと同様のプリンタダイアログを一旦呼び出し ここで「給紙」→「手差し」と設定しなくてはならなくなりました。 質問は以下の2点です。 1)この「手差し」の設定をしてプリントプリセットとして保存し、 次のプリントの際にこのプリセットを呼び出しても、 手差しが反映されません。(毎回手差しを設定し直さなければならない) 最下段の「プリンタ」から先で設定した事は プリセットとして使用できないのでしょうか? 2)この最下段の「プリンタ」からプリンタダイアログをいじり、 元のプリンタダイアログに戻ると、ダイアログ中心付近の 「用紙」の設定が勝手に変わってしまいます。 (私の場合は「A4」だったのが、勝手に「プリンタドライバで定義」となり、 用紙の向きが 縦→横になってしまいます) 長々とすみません。 CS2になってから手間が多く、仕事に時間がかかってしまいます。 わかる方いましたら教えてください。お願いいたします。

  • プリンター未設定

    携帯iphone8と 無線LANで 印刷機と繋げたいですが、プリンターの設定ができません。アプリを入れてプリンターの設定をするのですが、プリンターが表示されません。 パソコンは繋がりましたが、iPad iPhone が繋がりません。 初歩的なことかもしれませんが、教えていただけると助かります。 ※OKWAVEより補足:「EPSON社製品」についての質問です。

専門家に質問してみよう