私は「回転180度」チェックボックスの下のように含まれている複数のプリンタがあります。Controlまたはアクセスカスタムプリンタ設定(180度回転)
は別のものだが(「ねぇ」 「いいえ」)を意味します
プログラムでこの値を設定し、PrintTicket
を変更する方法はありますか?そうでない場合は、どうすれば現在の値を取得できますか?私のソフトウェアでは、これが設定されているかどうかを知る必要があり、設定されている場合は、可能であれば変更する必要があります。私のソフトウェアでは、printdialogを開く必要がなければ最高です。ユーザーがボタンをクリックせずに直接印刷できるソフトウェアなので、プログラムで設定または取得するのが私の探しているものです。
ManagementObjectSearcher
と通常のPrintDocument.DefaultPageSettings
のプロパティで検索しましたが、何も見つかりませんでした。
このオプションが設定されていない場合、私は自動的にユーザー用に一時的に設定します(そうしないと、特定のプリンタで上下逆に印刷されます)。私はユーザーのためにそれを設定しようとするのが面倒だが、私はそれを動作させる方法を把握することはできません。私はDEVMODE
構造体を見ていて、実装しようとしましたが、 "180度回転オプション"などはありません。
注:私はランドスケープモードを設定しようとしていません。これはかなり簡単で、何か異なっています。
私は次のことをやってみました: pdialog.PrintQueue.CurrentJobSettings.CurrentPrintTicket.PageOrientation = PageOrientation.ReversePortrait;
しかし、これが唯一のページの向きではなく、コンテンツを(コンテンツが同様に回転する必要があります)を反転。
私が印刷しているビジュアルを回転させると、余白はもはや正しくないので、どちらも機能しません!誰かが助けることを願っています。
ありがとうございます。
EDIT
私は変更する値を把握するハンスメソッドを使用していました。彼の方法はあらゆる種類のプリンタに適用されることに注意してください。 devmode
はPrintDialog
の値を変更します。これは私が何時間も時間をかけて解決しましたので、私が助けることができる人は、ここに私のコードがあり、私は共有したり、助けてうれしいです!最初にDefaultPrintTicket
をnew PrintServer()
から変更しましたが、UserPrintTicket
は実際にはWindows Control Panel if you don't switch back to the original one. *However*, this only seemed to work on just my pc (which was necessary), on a virtual machine for example the
の値の変化を見ることができる正しい方法と思われました。これは実際の使用よりむしろ練習でした。
var pdialog = new PrintDialog();
pdialog.PrintQueue = new PrintQueue(new LocalPrintServer(), _printername, PrintSystemDesiredAccess.AdministratePrinter); // this will be your printer. any of these: new PrintServer().GetPrintQueues()
pdialog.PrintTicket.PageMediaSize = size;
pdialog.PrintTicket.CopyCount = _amount;
if (CheckPrinterDriverName(_printername))
{
int magic = 361;
var defaulttckt = pdialog.PrintQueue.UserPrintTicket;
pdialog.PrintQueue.UserPrintTicket = PrinterModifier.ChangeDevMode(pdialog, magic, vis);
pdialog.PrintQueue.Commit();
pdialog.PrintVisual(vis, "Label");
//Set back old settings so it's not permanently changed
pdialog.PrintQueue.UserPrintTicket = defaulttckt;
pdialog.PrintQueue.Commit();
}
...
class PrinterModifier
{
public static PrintTicket ChangeDevMode(PrintDialog pdialog, int prpty, DrawingVisual vis)
{
var queue = pdialog.PrintQueue;
var cvt = new PrintTicketConverter(queue.Name, PrintTicketConverter.MaxPrintSchemaVersion);
// Display dialog, don't make changes
var devmode1 = cvt.ConvertPrintTicketToDevMode(pdialog.PrintTicket, BaseDevModeType.UserDefault);
// Consistency check
var dmSize = BitConverter.ToInt16(devmode1, 68);
var dmDriverExtra = BitConverter.ToInt16(devmode1, 70);
if (devmode1[361] == 0)
{
devmode1[361] = 1;
}
return cvt.ConvertDevModeToPrintTicket(devmode1, PrintTicketScope.PageScope);
}
}
プリントダイアログの変化の値が、それはまだ間違って印刷します。変更は適用されません。どんな助けも歓迎です!
あなたは自動的にそれを180度描くことはできませんか? –
@ DanielA.Whiteは私の更新をチェックしています。それがなぜ私がそれにアクセスする必要があるかをもう少し明確にすることを願っています! – Markinson
はx-y問題のように聞こえます。 –