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

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

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

C#によるプリンタ制御

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

■89582 / inTopicNo.1)  C#によるプリンタ制御
  
□投稿者/ S.Kos (1回)-(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#で、実際のプリンタ書き出しを前提とせず、プリンタドライバの設定だけを変更する、なんてコトはできないのでしょうか?


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

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

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


引用返信 編集キー/
■89586 / inTopicNo.4)  Re[3]: C#によるプリンタ制御
□投稿者/ 魔界の仮面弁士 (1973回)-(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();
}
引用返信 編集キー/
■89587 / inTopicNo.5)  Re[1]: C#によるプリンタ制御
□投稿者/ Jitta (432回)-(2018/12/06(Thu) 15:54:38)
No89582 (S.Kos さん) に返信
> けれども.NETの時代、C#で・・・、行き詰まりました。

.NET の時代という言い方をするなら、
プログラムからいじらないのが.NET流です。
ユーザーが指定するべきところで、
開発者が指定する事ではありません。
引用返信 編集キー/
■89588 / inTopicNo.6)  Re[2]: C#によるプリンタ制御
□投稿者/ S.Kos (3回)-(2018/12/06(Thu) 16:23:28)
魔界の仮面弁士さん、重ねてのご教示、誠にありがとうございました。
どれもみなWinAPIの関数を包み込むような名前(?)、手順もアレを追いかけてますね。
疑問にメドが立ったところで、改めて御礼申し上げます。ありがとうございました。

No89587 (Jitta さん) に返信
> .NET の時代という言い方をするなら、
> プログラムからいじらないのが.NET流です。
>
御意! 
とはいえ、ある書式は片面、続く書式は両面、さらにまた片面・・・こんなリクエストには、プログラム側で対応するしかありません。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ