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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89582 の関連記事表示

<< 0 >>
■89582  C#によるプリンタ制御
□投稿者/ S.Kos -(2018/12/06(Thu) 09:37:36)

    分類:[C#] 

    みなさま、こんにちは
    プリンタ制御について、ここでも多くのやり取りがありますが、いまひとつしっくりしません。

    以下、直接的なご教示はもちろん、どこどこを見よ、とのご示唆だけでもいただければ幸いです。

    デフォルトプリンタの、例えば「両面印刷」を、コンソールから制御しようと考えています。
    例えば CtrlPrinter.exe -V とすると長編綴じ両面印刷に、
        CtrlPrinter.exe -S で片面印刷、てな風に…

    これまでに、ゴリゴリ(笑)のCによるアプリケーションで、DEVMODE構造体を取得して書き戻したことがあります。

    けれども.NETの時代、C#で・・・、行き詰まりました。


    Windows10/Pro + VSEXPRESS2017forWindowDesktop 環境です。

    using System.Drawing;
    using System.Drawing.Printing;
    using System.Printing;
    とした上で、

    System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
    これは巧くデキているようです。

    なぜなら、
    pd.PrinterSettings.PrinterName にデフォルトのプリンタ名
    pd.PrinterSettings.CanDuplex に両面印刷機能の有無
    pd.PrinterSettings.Duplex に両面/片面設定情報
    を読み出しています。

    さて、両面/片面情報を書き換え、例えば
    pd.PrinterSettings.Duplex = System.Drawing.Printing.Duplex.Horizontal
    とし、これをプリンタドライバに書き戻すところで、行き詰まりました。


    書き換えた情報を、プリンタドライバへ書き戻す術を、ご教示ください。Win32APIレベルだと ResetDC() の感覚ですね・・。

    そもそもC#で、実際のプリンタ書き出しを前提とせず、プリンタドライバの設定だけを変更する、なんてコトはできないのでしょうか?

親記事 /過去ログ154より / 関連記事表示
削除チェック/

■89583  Re[1]: C#によるプリンタ制御
□投稿者/ 魔界の仮面弁士 -(2018/12/06(Thu) 10:21:13)
    No89582 (S.Kos さん) に返信
    > デフォルトプリンタの、例えば「両面印刷」を、コンソールから制御しようと考えています。
    > 例えば CtrlPrinter.exe -V とすると長編綴じ両面印刷に、
    >     CtrlPrinter.exe -S で片面印刷、てな風に…

    C# ではなく PowerShell でも良ければ、こんな感じでいけるかも。

    $PrinterName = "LBP842C*"
    Get-Printer $PrinterName | Set-PrintConfiguration -DuplexingMode OneSided
    Get-Printer $PrinterName | Set-PrintConfiguration -DuplexingMode TwoSidedLongEdge
    Get-Printer $PrinterName | Set-PrintConfiguration -DuplexingMode TwoSidedShortEdge



    > これをプリンタドライバに書き戻すところで、行き詰まりました。

    2008 年の表記ルール改定以降、現在は「プリンター ドライバー」と書かれるそうで。
    https://pc.watch.impress.co.jp/docs/2008/0725/ms.htm
    https://www.microsoft.com/en-us/language/Search?&searchTerm=printer+driver&langID=Japanese&Source=true&productid=All+Products
記事No.89582 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89584  Re[2]: C#によるプリンタ制御
□投稿者/ S.Kos -(2018/12/06(Thu) 12:17:19)
    No89583 (魔界の仮面弁士 さん) に返信
    > C# ではなく PowerShell でも良ければ、こんな感じでいけるかも。
    なんと、こんな手があるとは! 思っても見ませんでした。
    いつものことながら、貴兄の知識と技術には、唯々脱帽するのみです。

    当面の課題はこれでクリアできますが、本質的な疑問は残ったままです

    C#だと、Win32APIレベル ResetDC() のような書き戻し、はできないのですか?
    重ねてご教示いただけれは幸いです。

記事No.89582 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89586  Re[3]: C#によるプリンタ制御
□投稿者/ 魔界の仮面弁士 -(2018/12/06(Thu) 14:54:22)
    2018/12/06(Thu) 15:09:35 編集(投稿者)

    No89584 (S.Kos さん) に返信
    > こんな手があるとは!
    別案として、
     rundll32 printui.dll,PrintUIEntry
    を /Sr 指定で呼び出す手もありそうですが、
    一部の設定のみを切り替えるような目的には向かないですね。


    > ゴリゴリ(笑)のCによるアプリケーションで、DEVMODE構造体を取得して書き戻したことがあります。

    DEVMODE 構造体を得る手段としては、
    PageSettings.CopyToHdevmode メソッドや
    PritereSettings.GetHdevmode メソッドがありますね。
    そこから先は API になるかもしれませんけど。

    これ自体は SetHDevmode メソッドでの利用を想定したものかも知れませんが、
    一応その値を元に、StandardPrintController クラスが内部で
    ResetDC API に引き渡しているようです。
    https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Printing/DefaultPrintController.cs%2c90



    > C#だと、Win32APIレベル ResetDC() のような書き戻し、はできないのですか?

    // using System.Printing;
    var setting = Duplexing.TwoSidedLongEdge;

    // var sv = new PrintServer(PrintSystemDesiredAccess.AdministrateServer);
    var sv = new LocalPrintServer(PrintSystemDesiredAccess.AdministrateServer);
    var pq = new PrintQueue(sv, printerName, PrintSystemDesiredAccess.AdministratePrinter);
    var pc = pq.GetPrintCapabilities();
    var dc = pc.DuplexingCapability;
    if (dc.Contains(setting))
    {
     pq.DefaultPrintTicket.Duplexing = setting;
     pq.Commit();
    }
記事No.89582 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89587  Re[1]: C#によるプリンタ制御
□投稿者/ Jitta -(2018/12/06(Thu) 15:54:38)
    No89582 (S.Kos さん) に返信
    > けれども.NETの時代、C#で・・・、行き詰まりました。

    .NET の時代という言い方をするなら、
    プログラムからいじらないのが.NET流です。
    ユーザーが指定するべきところで、
    開発者が指定する事ではありません。
記事No.89582 のレス /過去ログ154より / 関連記事表示
削除チェック/

■89588  Re[2]: C#によるプリンタ制御
□投稿者/ S.Kos -(2018/12/06(Thu) 16:23:28)
    魔界の仮面弁士さん、重ねてのご教示、誠にありがとうございました。
    どれもみなWinAPIの関数を包み込むような名前(?)、手順もアレを追いかけてますね。
    疑問にメドが立ったところで、改めて御礼申し上げます。ありがとうございました。

    No89587 (Jitta さん) に返信
    > .NET の時代という言い方をするなら、
    > プログラムからいじらないのが.NET流です。
    >
    御意! 
    とはいえ、ある書式は片面、続く書式は両面、さらにまた片面・・・こんなリクエストには、プログラム側で対応するしかありません。
記事No.89582 のレス / END /過去ログ154より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -