質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

8977閲覧

64bit環境で印刷ダイアログ(System.Windows.Forms.PrintDialog.ShowDialog)が表示されない

M.Fortune

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/05/24 12:09

###事象
32bit環境で作成したアプリケーションを64bit環境で実行すると印刷ダイアログが表示されません。
32bit環境では表示されました。

※環境について
32bit環境:WindowsXP
.Net framework2.0
64bit環境:Windows7以上
.Net framework3.5以上
###やったこと
ネットで調べたところ、マイクロソフトのサイトで下記ページを発見しました。
64bit環境でSystem.Windows.Forms.PrintDialogが使えない?

このページを参考に下記①のソースに「UseEXDialog」プロパティを追加し、②のように設定したのですが、それでも印刷ダイアログは表示されません。
マルチスレッドで実行しているのが影響しているみたいです。

C#

12using (PrintDialog pd = new PrintDialog()) 3{ 4 pd.PrinterSettings = new System.Drawing.Printing.PrinterSettings(); 5 pd.PrinterSettings.PrintRange = System.Drawing.Printing.PrintRange.AllPages; 6 pd.PrinterSettings.Collate = true; 7 pd.PrinterSettings.Copies = 1; 8 pd.AllowPrintToFile = false; 9 pd.AllowSelection = false; 10 pd.AllowSomePages = false; 11 pd.PrintToFile = false; 12 pd.ShowHelp = false; 13 pd.ShowNetwork = true; 14 if (pd.ShowDialog() == DialogResult.OK) 15 { 16 //OKがクリックされた時は印刷する 17 }

C#

12using (PrintDialog pd = new PrintDialog()) 3{ 4 // UseEXDialogプロパティに'true'を設定 5 pd.UseEXDialog = true; --6 pd.PrinterSettings = new System.Drawing.Printing.PrinterSettings(); 7 pd.PrinterSettings.PrintRange = System.Drawing.Printing.PrintRange.AllPages; 8 pd.PrinterSettings.Collate = true; 9 pd.PrinterSettings.Copies = 1; 10 pd.AllowPrintToFile = false; 11 pd.AllowSelection = false; 12 pd.AllowSomePages = false; 13 pd.PrintToFile = false; 14 pd.ShowHelp = false; 15 pd.ShowNetwork = true; 16 if (pd.ShowDialog() == DialogResult.OK) 17 { 18 //OKがクリックされた時は印刷する 19 }

###聞きたいこと
・設定の仕方/箇所は上記のような書き方であっているか?
・マルチスレッドでも動作するには?
・その他解消方法

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

プリンタ選択ダイアログを表示して印刷するの「通常のコメント [ Daddy ] 2013年7月23日 18:19:53」のコメントに下記のような情報がありました。
これを見る限り32bitでは普通に別スレッドでダイアログを表示できるけど、64bitの場合はそれはできず、UIスレッド(通常はメイン・スレッド)へ依頼するしかないようです。

また、PrintDialog を Windows Application で、且つ別スレッドで実行している場合は、

【System.Runtime.InteropServices.SEHException
外部コンポーネントが例外をスローしました。】が
発生する為、UIスレッドで実行(Invoke)が必要になるので注意が必要です。
それに加え、STAThread 属性指定を忘れていないか確認が必要です。

Console Application で実行する場合は、UIスレッドの縛りが無い為、STAThread 属性指定と UseEXDialog

のみ注意していれば問題なさそうです。

但し、32Bit環境では、これらの意識が必要ない以上、APIのバグであると考えられますが、

回避コードを必要としている以上改善の期待は出来ないのではないかと思います。

投稿2016/05/24 15:16

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.Fortune

2016/05/25 05:54

こんにちは。 ご回答頂きありがとうございます。 別スレッドでの印刷ダイアログ表示は現時点で実現できないのですね。 メインスレッドから実行できないかチームで検討したいと思います。
guest

0

■メモ書き 兼 報告

  • 解決策

PrintDialogを使用することは諦め、新規に印刷ダイアログを自作することで落ち着きました。
参考URL:すらすらプログラマー
nanoblog
C# と VB.NET の質問掲示板_■14513 / inTopicNo.3

  • 問題点

印刷ダイアログにてプリンタのプロパティを設定したはずが反映されない

以上です。

投稿2016/05/27 00:35

M.Fortune

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.Fortune

2016/05/27 00:39

基本的にプロパティで設定を変更するような印刷は行わないので、これでいいかという感じで進んでしまいました。 でも普通に考えたらよくないですよね...要望であがる前に修正したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問