- PR -

Vista環境でのプリンタ設定について

1
投稿者投稿内容
綾瀬 了
会議室デビュー日: 2008/01/11
投稿数: 2
投稿日時: 2008-01-11 01:01
はじめまして。

えー・・あまりにも衝撃的な事で、頭が真っ白になっております(汗
ですが、ちょっと途方に暮れておりますので質問させてください。

開発環境:VB6.0+ActiveReports2.0J+WindowsXP
    :VS2005(VB2005,C#)+ActiveReports .NET 2.0J Std.
実行環境:いずれもWindows Vista Business

上記の開発環境の組み合わせで作成した帳票印刷アプリケーションがあります。
いずれもActiveReportsを使っているのですが、出力先のプリンタの設定を取得し
VB6版のアプリはレジストリに、.NET版のアプリはXmlファイルに設定を保存しています。

・・まぁ、よくあるパターンだと思います。

問題は、このプリンタ設定の方法なのです。

プリンタ設定には、いずれもPageSetupDialogに相当するものを使っているのですが
(相当する、というのはVB6の場合はActiveReportsにある非公開?メソッドが
このPageSetupDialogに相当するもので、それを使っているのです)
Vista以前のOSだと、PageSetupDialogに「プリンタの設定」ボタンが出現し、そこで
登録されているプリンタを選択、取得することができました。

しかし、VistaになってこのPageSetupDialogからプリンタの設定ボタンが無くなってしまったのです。

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2012767&SiteID=7

このURLからたどると、どうもこれはOSレベル(Win32API)レベルの仕様変更みたいです。

現在、VB6.0のアプリを.NET2005へ移植しているのですが、この問題にぶち当たってしまいました。

そこで質問なのですが

・同じ問題に悩まされた人は、どのように回避したのでしょうか?
・同等の機能を実装するために参考になりそうなソースやライブラリをご存知ではないでしょうか?
・そもそも、この件に関する情報をご存知ではないでしょうか?

ちょっと質問が散発的で申し訳ないのですが、これを何とかしないと3桁近い本数のアプリに大幅な修正を施さなくてはいけなくなってしまい真面目に途方に暮れています。

お力を貸してください。よろしくお願いします。



未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2008-01-11 09:45
.NET Framework では、この要件を満たすクラスやメソッドは用意いません。
そのため、Win32 API を使用する必要があります。

プリンタのプロパティを表示させる API としては、DocumentProperties API を使用することができます。

以下はVisual Basic 2005 から、本 API を呼び出すための定義と実装例です。



' API 定義
Private Declare Auto Function OpenPrinter Lib "winspool.drv" ( _
<MarshalAs(UnmanagedType.LPTStr)> ByVal pPrinterName As String, _
ByRef phPrinter As IntPtr, _
ByVal pDefault As IntPtr) As Int32

Private Declare Auto Function DocumentProperties Lib "winspool.drv" ( _
ByVal hwnd As IntPtr, _
ByVal hPrinter As IntPtr, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal pDeviceName As String, _
ByVal pDevModeOut As IntPtr, _
ByVal pDevModeIn As IntPtr, _
ByVal fMode As Integer) As Int32

Private Declare Auto Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As IntPtr) As Int32
Private Declare Auto Function GlobalLock Lib "kernel32" (ByVal hmem As IntPtr) As IntPtr
Private Declare Auto Function GlobalFree Lib "kernel32" (ByVal hmem As IntPtr) As Int32
Private Declare Auto Function GlobalUnlock Lib "kernel32" (ByVal hMem As IntPtr) As Int32

Private Const DM_OUT_BUFFER As Short = 2
Private Const DM_IN_PROMPT As Short = 4
Private Const DM_IN_BUFFER As Short = 8

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim rc As Integer
Dim hPrinter As IntPtr
Dim hDevModeIn As IntPtr
Dim hDevModeOut As IntPtr
Dim prtDocument As New Printing.PrintDocument

Dim prrtName As String = prtDocument.PrinterSettings.PrinterName

hDevModeIn = prtDocument.PrinterSettings.GetHdevmode(prtDocument.PrinterSettings.DefaultPageSettings)
hDevModeOut = prtDocument.PrinterSettings.GetHdevmode(prtDocument.PrinterSettings.DefaultPageSettings)

Dim pDevModeIn As IntPtr = GlobalLock(hDevModeIn)
Dim pDevModeOut As IntPtr = GlobalLock(hDevModeOut)

OpenPrinter(prrtName, hPrinter, IntPtr.Zero)
rc = DocumentProperties(Me.Handle, hPrinter, prrtName, pDevModeOut, pDevModeIn, DM_IN_PROMPT Or DM_IN_BUFFER Or DM_OUT_BUFFER)
If rc = 1 Then
prtDocument.PrinterSettings.SetHdevmode(pDevModeOut)
End If

GlobalUnlock(hDevModeIn)
GlobalUnlock(hDevModeOut)
GlobalFree(hDevModeIn)
GlobalFree(hDevModeOut)
ClosePrinter(hPrinter)
End Sub
綾瀬 了
会議室デビュー日: 2008/01/11
投稿数: 2
投稿日時: 2008-01-11 13:00
>>未記入様

ご返答ありがとうございます。
早速サンプルコードを試してみました。

「おお、こんなダイアログが出せるのか!」と驚嘆したのですが・・・

申し訳ありません、私の質問の文章も悪いのですがちょっと意図したものとは異なりました。

私が現在困っているのは、Vista環境だとPageSetupDialog内にある「プリンタの設定」ボタンがなくなっているため
「インストールされているプリンタを選択し、そのプリンタ名を取得する」という機能が使えなくなった事なのです。

これまで、PageSetupDialogでは上記のボタンがありましたので出力先プリンタを標準で使うプリンタから別のプリンタに変更すれば、変更先のプリンタ名を取得することができました。
この設定を保持しておき、印刷時にActiveReportsに渡してやることで任意のプリンタへ出力していたのです。

ところが、Vista上でのPageSetupDialogに上記のボタンがなくなってしまったため出力するプリンタが標準で使うプリンタ以外設定できなくなってしまったのです。

出力先プリンタ、用紙サイズ、余白などの設定を全てPageSetupDialogに任せっきりにしてしまったツケと言えばツケなのですが・・・

申し訳ありませんが、何かご存知でしたらご教授願います。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2008-01-12 08:10
普通に出力する際は、出力プリンターと用紙サイズぐらいしか変更しないので
プリンター選択・用紙サイズを選択・設定ボタンを配置した簡易画面を用意しています。
参考まで


1

スキルアップ/キャリアアップ(JOB@IT)