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

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

ただいまの
回答率

89.70%

C# 連続印刷時に「通常使うプリンタ」の切替がすぐに反映されない

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 2,627

ninnin777

score 11

以下の件について、解決法などご存じの方、またアイデアなどございましたらご教示頂ければと存じます。

前提・実現したいこと

複数のPDFファイルをファイルごとにカラー印刷、モノクロ印刷を切り替えながら、連続で印刷を実行したいと思っています。

複数のPDFファイルには、モノクロで印刷するファイル、カラーで印刷するファイルがランダムで混合されています。
あらかじめ、「デバイスとプリンタ」にカラー印刷用のプリンタ、モノクロ印刷用のプリンタが登録されています。

ループ処理の中で、
PDFファイルごとに、上記のカラー用プリンタ、モノクロ用プリンタを「通常使うプリンタ」に切り替えながら、1ファイルずつ印刷を実行しています。

発生している問題・エラーメッセージ

連続で印刷する際、カラー用、モノクロ用のプリンタの切り替え処理が遅延しているのか、指定どおり正確に反映されません。
ただし、デバッグモードでステップ実行していくと、指定どおり正確に反映されます。

該当のソースコード

        private void button1_Click(object sender, EventArgs e)
        {
            //引数にファイル名と印刷モードを渡す
            foreach(printParams cls in targetFileParams) {

                src = cls.filePath;
                cmode = cls.colorMode;
                //mLogger.Debug(src);
                //mLogger.Debug(cmode.ToString);

                //印刷実行
                //SendPrinter(src, cmode);
                SendPrinter2(src, cmode);
                Debug.Print("印刷されました" + " : " + cmode);
            }
        }

        private void SendPrinter2(string src, COLOR_MODE c)
        {
            //プリンタ名を取得する
            string printername1 = "";
            if (c == COLOR_MODE.enFullColor)
            {
                printername1 = AutoPrinter_Color;
            }
            else
            {
                printername1 = AutoPrinter_Mono;
            }

            SetDefaultPrinter(printername1);
            Application.DoEvents();

            //印刷実行
            Process.Start(@"C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe", "/print " + src);
        }

        /// <summary>
        /// 「通常使うプリンタ」に設定する
        /// </summary>
        /// <param name="printerName">プリンタ名</param>
        public void SetDefaultPrinter(string printerName)
        {
            //WshNetworkオブジェクトを作成する
            Type t = Type.GetTypeFromProgID("WScript.Network");
            object wshNetwork = Activator.CreateInstance(t);
            //SetDefaultPrinterメソッドを呼び出す
            t.InvokeMember("SetDefaultPrinter",
                System.Reflection.BindingFlags.InvokeMethod,
                null, wshNetwork, new object[] { printerName });
        }

試したこと

デバッグでのステップ実行では正確に反映されているので、プリンタ切り替えの遅延では?と思い、プリンタ切り替え処理と、印刷実行の間に、10秒間くらいのスリープ処理、待機処理を入れるなどして実行してみましたが、やはり指定どおりに反映されません。
※※ちなみに、ステップ実行の際は、プリンタ切り替えと印刷実行の間で、10秒間も間を空けていません。

※※また、エラーは出ておらず、ログには指定どおりのプリンタ名が渡され、設定されています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

SetDefaultPrinter(printername1);
Application.DoEvents();

//印刷実行
Process.Start(@"C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe", "/print " + src);


この行を以下の様に変えて試して貰えますか。

//印刷実行
Process.Start(@"C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe", "/print:printer=" + '\u0022' + printername1 + '\u0022' + " " + src);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/04 16:42

    ご指摘の通り修正し実行したところ、正常に印刷できるようになりました。
    また、各PDFファイルもカラー、モノクロの指定通りに出力されるようになりました!

    参考として、以下のように修正いたしました。
    Process.Start(@"C:\Program Files\Tracker Software\PDF Viewer\PDFXCview.exe", "/print:printer=" + '\u0022' + printername1 + '\u0022' + " " + src);

    困っていたところ、早速のご回答、非常に助かりました。
    誠にありがとうございました。

    キャンセル

  • 2017/07/04 16:46

    ダブルクォートですかー。惜しい!w
    一手間掛けさせてしまってすいません。

    キャンセル

  • 2017/07/04 21:57

    あとでここ見る人様に回答書き換えさせてもらいますねー。

    キャンセル

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

  • ただいまの回答率 89.70%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる