C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: プリンタをVB.NETからカラー設定する


(過去ログ 118 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■69301 / inTopicNo.1)  プリンタをVB.NETからカラー設定する
  
□投稿者/ じぇじぇじぇ (1回)-(2013/12/15(Sun) 10:06:58)

分類:[.NET 全般] 

2013/12/15(Sun) 17:52:08 編集(投稿者)
2013/12/15(Sun) 17:31:13 編集(投稿者)
2013/12/15(Sun) 17:31:03 編集(投稿者)

いつも参考にさせていただきありがとうございます
質問をお願いします

[やりたいこと]
プリンタのカラー、モノクロの設定をvb.netから制御したい

PrinterSettings.DefaultPageSettings.Color = True
でも
e.PageSettings.Color = True

でもカラーにならずにいきづまりました・・・



引用返信 編集キー/
■69303 / inTopicNo.2)  Re[1]: プリンタをVB.NETからカラー設定する
□投稿者/ shu (450回)-(2013/12/15(Sun) 22:23:42)
No69301 (じぇじぇじぇ さん) に返信

プリンタがカラー印刷に対応している場合は既定でカラーのはずなんですがどうでしょう?

http://msdn.microsoft.com/ja-jp/library/system.drawing.printing.pagesettings.color(v=vs.110).aspx
引用返信 編集キー/
■69304 / inTopicNo.3)  Re[2]: プリンタをVB.NETからカラー設定する
□投稿者/ じぇじぇじぇ (2回)-(2013/12/16(Mon) 05:32:57)
> プリンタがカラー印刷に対応している場合は既定でカラーのはずなんですがどうでしょう?

モノクロのほうが経済的なので規定値をモノクロにしている人の操作を想定しています
その都度プリンタの設定を開いてカラー指定するのではなくて
プログラムのUIにカラーボタンを付けたいと思っています
引用返信 編集キー/
■69305 / inTopicNo.4)  Re[3]: プリンタをVB.NETからカラー設定する
□投稿者/ shu (451回)-(2013/12/16(Mon) 08:10:26)
No69304 (じぇじぇじぇ さん) に返信

とりあえずリンク先のサンプルで試してみてはどうでしょう?
引用返信 編集キー/
■69308 / inTopicNo.5)  Re[4]: プリンタをVB.NETからカラー設定する
□投稿者/ じぇじぇじぇ (3回)-(2013/12/16(Mon) 10:33:17)
No69305 (shu さん) に返信
> ■No69304 (じぇじぇじぇ さん) に返信
>
> とりあえずリンク先のサンプルで試してみてはどうでしょう?


一応試してみました
それがこれなんです
↓↓↓↓↓↓↓↓↓

> PrinterSettings.DefaultPageSettings.Color = True
> でも
> e.PageSettings.Color = True
>
> でもカラーにならずにいきづまりました・・・


引用返信 編集キー/
■69309 / inTopicNo.6)  Re[5]: プリンタをVB.NETからカラー設定する
□投稿者/ shu (453回)-(2013/12/16(Mon) 10:35:49)
No69308 (じぇじぇじぇ さん) に返信
> 一応試してみました
> それがこれなんです
> ↓↓↓↓↓↓↓↓↓
>

これはColorプロパティへの設定部分だけであってサンプルは
全コードが載っていると思いますがその相違は何なのでしょうか?
引用返信 編集キー/
■69323 / inTopicNo.7)  Re[1]: プリンタをVB.NETからカラー設定する
□投稿者/ Jitta (123回)-(2013/12/16(Mon) 22:07:27)
Jitta さんの Web サイト
No69301 (じぇじぇじぇ さん) に返信
 プリンター メーカーに確認しましょう。

 プリンターの印刷設定は、DEVMODEW という構造体で制御されます。
http://msdn.microsoft.com/en-us/library/windows/hardware/ff552837.aspx

この内容は、Windows Vista 以降ならば、ユーザー毎に保存されています。
HKEY_CURRENT_USER\Printers\DevmodePerUser の、プリンター名

dmColor メンバーが、プリンターがカラー印刷に対応しているかどうかを示すフラグです。
このドライバーは、このフラグを TRUE にして通知しますが、
アプリケーションがこのフラグを FALSE に設定すると、
白黒印刷となります(実現方法は、ドライバーに任されます)。

 ところが、MSDN で説明されている構造体は半分だけなのです!!
この構造体の後ろには、メーカーが自由に定義できるデータがあります。
標準のプロパティで変更できるのは、MSDN で説明されている部分のみです。
メーカー定義の部分は、メーカーが提供する方法、通常は UI によってのみ、変更可能です。

 私が使っている FUJI-XEROX のプリンターでは、
カラーについての設定が、「プリンターのプロパティ」で表示されるところと、
「印刷設定」で表示されるところにあります。
このうち、「プリンターのプロパティ」で表示される方の設定は、
「印刷設定」で表示される設定よりも強制力を持っています。
そのため、「印刷設定」でカラー印刷を指示しても、
「プリンターのプロパティ」が白黒印刷を指示していると、白黒で印刷されます。


 もし、レジストリの操作ができるなら、次のような確認方法もあります。

1 プリンターの印刷設定で、「カラー印刷」にします。
2 上記のレジストリ キーをエクスポートします。
3 プリンターの印刷設定で、「白黒印刷」にします。
4 上記のレジストリ キーを、先とは別の名前でエクスポートします。

両方のファイルを比較して、先頭から何バイト目が違っているか、確認します。
0xDC、220バイト以内が違っているなら、標準のプロパティで変えられるはずです。
220バイト目よりも後ろが変わっているなら、標準のプロパティでは変えられません。
もちろん、カラー印刷に関わる設定が複数あれば、全てを確認してください。


 もし、プラットフォーム呼び出しができるなら、次のような解決方法があります。

1 プリンターの設定を、特別に印刷したい状態にします。
2 プラットフォーム呼び出しで DocumentProprities を呼び出し、DEVMODEW 構造体を取得します。
3 その DEVMODEW 構造体を保存しておきます。
4 プリンターの設定を、通常使いたい設定にします。
5 アプリケーションからの印刷時に、3で保存した DEVMODEW を読み込みます。
6 DocumentProperties 関数で、特別に印刷したい状態に設定します。


 そして、多くの場合、ユーザー企業では「カラー印刷」に設定したプリンターと、
「白黒印刷」に設定したプリンターの2つを作っていると思います。
いちいち印刷設定を開くより、プリンターを選ぶ方が楽ですから。

引用返信 編集キー/
■69325 / inTopicNo.8)  Re[2]: プリンタをVB.NETからカラー設定する
□投稿者/ オショウ (113回)-(2013/12/17(Tue) 09:36:02)
No69323 (Jitta さん) に返信
> ■No69301 (じぇじぇじぇ さん) に返信
>  プリンター メーカーに確認しましょう。

  余談な話かもしれませんが・・・
  私も保有するキャノンのカラーインクジャットプリンター(ネットワーク接続)で
  いろいろ試したところ、奇異な現象を確認しました。

  Win32 APIで行っているのですが、OpenPrinterの際、PRINTER_DEFAULTS
  構造体のDesiredAccess を、

  PRINTER_ACCESS_USE Or STANDARD_RIGHTS_REQUIRED

  で事足りるはずなのですが、DEVMODE構造体の値を変更し、SetPrinterした時点で、
  リターン値がエラーとなりました。が、カラー・モノクロの変更は為されていまし
  た。

  そこで、PRINTER_ALL_ACCESS に変更して再度、行ったところ・・・
  SetPrinterで、リターン値が成功となりました。
  カラー・モノクロの変更も正常に行われていました。

  よって、キャノンのプリンタードライバーのバグがあるように思います。

  メーカー独自情報部分を変更する場合、APIのリターン値が、エラーとなっても、
  中身は正常に反映されている場合があります。
  因みに、キャノンの業務用ラベルプリンターも同様でした。

以上。参考まで・・・
引用返信 編集キー/
■69355 / inTopicNo.9)  Re[3]: プリンタをVB.NETからカラー設定する
□投稿者/ Jitta (124回)-(2013/12/18(Wed) 21:56:46)
No69325 (オショウ さん) に返信
> ■No69323 (Jitta さん) に返信
>>■No69301 (じぇじぇじぇ さん) に返信
>> プリンター メーカーに確認しましょう。
>
>   余談な話かもしれませんが・・・
>   私も保有するキャノンのカラーインクジャットプリンター(ネットワーク接続)で
>   いろいろ試したところ、奇異な現象を確認しました。
>
>   Win32 APIで行っているのですが、OpenPrinterの際、PRINTER_DEFAULTS
>   構造体のDesiredAccess を、
>
>   PRINTER_ACCESS_USE Or STANDARD_RIGHTS_REQUIRED
>
>   で事足りるはずなのですが、DEVMODE構造体の値を変更し、SetPrinterした時点で、
>   リターン値がエラーとなりました。が、カラー・モノクロの変更は為されていまし
>   た。
>
>   そこで、PRINTER_ALL_ACCESS に変更して再度、行ったところ・・・
>   SetPrinterで、リターン値が成功となりました。
>   カラー・モノクロの変更も正常に行われていました。
>
>   よって、キャノンのプリンタードライバーのバグがあるように思います。
>
>   メーカー独自情報部分を変更する場合、APIのリターン値が、エラーとなっても、
>   中身は正常に反映されている場合があります。
>   因みに、キャノンの業務用ラベルプリンターも同様でした。
>
> 以上。参考まで・・・
OS と、レベルは?
Vista 以降、レベル2なら、グローバル設定にアクセスするので、ALL_ACCESS が必要かもしれません。
引用返信 編集キー/
■69357 / inTopicNo.10)  Re[4]: プリンタをVB.NETからカラー設定する
□投稿者/ オショウ (114回)-(2013/12/19(Thu) 00:09:29)
No69355 (Jitta さん) に返信
> OS と、レベルは?
> Vista 以降、レベル2なら、グローバル設定にアクセスするので、ALL_ACCESS が必要かもしれません。

  SetPrinter API のリターン値が、その設定如何に依存するというのは解りますが
  結果として、カラー・モノクロの設定が反映されてしまっているということにつ
  いては、ドライバーのバグなのか・・・それとも仕様なのか・・・
  と言う点については、疑問が残るという点で敢えて書きました。

  Win7 Ultimate SP1 32bit 環境でです。
  一応、プログラムを管理者権限付でも比較しましたが、管理者権限には関わりなく
  同様の結果となりました。

以上。参考まで
引用返信 編集キー/
■69359 / inTopicNo.11)  Re[1]: プリンタをVB.NETからカラー設定する
□投稿者/ 魔界の仮面弁士 (467回)-(2013/12/19(Thu) 11:43:50)
No69301 (じぇじぇじぇ さん) に返信
> プリンタのカラー、モノクロの設定をvb.netから制御したい
> PrinterSettings.DefaultPageSettings.Color = True
> でも
> e.PageSettings.Color = True

ところで、印刷処理はどのようにして行っていますか?

上記の設定が有効になるのは、System.Drawing.Printing.PrintDocument や
ActiveReports 経由で印刷する場合などですね。

Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6.Printer 経由で
印刷する場合は、Printer クラスの .ColorMode を設定することになりますし、
Excel からの印刷だとすれば、PageSetup の .BlackAndWhite プロパティです。



まぁ、PageSettings の例を持ち出している以上、PrintDocument を
利用されているのだと思いますが、プリンタドライバーによっては、
Color プロパティの設定が利かない場合もあります。

ドライバーの更新によって挙動が変わる場合もあるので、利用しているドライバーの
バージョンアップ(あるいはバージョンダウン)も検討してみてください。
http://ap.atmarkit.co.jp/bbs/core/vblab/26323


ドライバーの差し替えができない場合や、ドライバー変更で効果が無い場合は、
API を用いて、DEVMODE 構造体のプライベート領域で設定することになります。
これについては、Jitta さんが No69323 で触れられていますね。

プライベート領域の仕様はプリンタードライバーに依存するため、どの場所を
設定すればよいのかは自己解析するなり、メーカーへの問い合わせなりが必要で、
必要なコード量も多くなってしまい、それなりに苦労すると思います。


運用面で回避できるのであれば、
>> 「カラー印刷」に設定したプリンターと、
>> 「白黒印刷」に設定したプリンターの2つを作っている
も検討してみては如何でしょうか。

http://wakouji.sakura.ne.jp/ugoke_windows/ugoke2/pcsub42.htm
http://www.salty1.com/backnumber/703/703.html
http://blogs.yahoo.co.jp/akio_myau/44543466.html
引用返信 編集キー/
■69373 / inTopicNo.12)  Re[5]: プリンタをVB.NETからカラー設定する
□投稿者/ Jitta (126回)-(2013/12/19(Thu) 21:09:35)
Jitta さんの Web サイト
No69357 (オショウ さん) に返信

> いては、ドライバーのバグなのか・・・それとも仕様なのか・・・
 ごめんなさい、こっちがメインだった。
XBox から入力していたのですが、間違って[Back]キーを押して、
入力していたものを消してしまい、50音表から入力するのが面倒になってしまったのでした。


 改めて。  ドライバーは関係ないです!!

 現在有効なプリンター ドライバーには、V3 と呼ばれるものと V4 と呼ばれるものの2種類があります。
V3 ドライバーの開発に関わっています。(昨年、他部署から引き継いだ)
V4 については、ドキュメントを拾い読みしている程度です。
キヤノンのドライバーがどちらで実装しているのか、分かりません。

 私が知っている範囲では、SetPrinter 関数でドライバー関数が呼び出されることはありません。
GetPrinter, SetPrinter は、スプーラーまでしか関与していません。
ドライバーへ DEVMODE を問い合わせるには、DocumentProperties 関数を使用します。
http://msdn.microsoft.com/ja-jp/library/cc428447.aspx

 日本語の GetPrinter 関数の説明にはかかれていませんが、
英語の GetPrinter function の Remarks セクションには、
レベル2や3、PRINTER_INFO_2, PRINTER_INFO_3 にはセキュリティ記述子を含んでいるので、
セキュリティ記述子へのアクセス権を指定して OpenPrinter を呼び出せ、と書かれています。
エラーになったのは、こちらの方が引っかかったのではないでしょうか。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144911.aspx
> For the PRINTER_INFO_2 and PRINTER_INFO_3 structures that contain
> a pointer to a security descriptor, the function retrieves only those
> components of the security descriptor that the caller has permission
> to read. To retrieve particular security descriptor components, you
> must specify the necessary access rights when you call the OpenPrinter
> function to retrieve a handle to the printer.

 プリンターは、Windows Vista 以降でだいぶ変わっています。
Win32 API の日本語ドキュメントは、Windows 2000 くらいで止まっているので、
英語を参照した方が良いと思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -