对于给定的打印文档PrintSettings
,该Duplex
值可能(并且可能)设置为Duplex.Default
.
我如何确定这是否意味着所选打印机将或不会进行双面打印?
如何找到已安装打印机支持的行为的默认值?
对于给定的打印文档PrintSettings
,该Duplex
值可能(并且可能)设置为Duplex.Default
.
我如何确定这是否意味着所选打印机将或不会进行双面打印?
如何找到已安装打印机支持的行为的默认值?
我不确定您能否获得给定打印机的默认值。但是,如果您有创意,您可以获得实际的当前值。但是,如果您想确保您拥有正确的信息,您将不得不了解 DEVMODE 结构。这不是一个简单的操作,需要一些花哨的Win32 fu。这改编自几个来源,但适用于我的(诚然参差不齐的)测试。
[DllImport("kernel32.dll")]
static extern bool GlobalFree(IntPtr hMem);
[DllImport("kernel32.dll")]
public static extern IntPtr GlobalLock(IntPtr handle);
[DllImport("kernel32.dll")]
public static extern IntPtr GlobalUnlock(IntPtr handle);
private static short IsPrinterDuplex(string PrinterName)
{
IntPtr hDevMode; // handle to the DEVMODE
IntPtr pDevMode; // pointer to the DEVMODE
DEVMODE devMode; // the actual DEVMODE structure
PrintDocument pd = new PrintDocument();
StandardPrintController controller = new StandardPrintController();
pd.PrintController = controller;
pd.PrinterSettings.PrinterName = PrinterName;
// Get a handle to a DEVMODE for the default printer settings
hDevMode = pd.PrinterSettings.GetHdevmode();
// Obtain a lock on the handle and get an actual pointer so Windows won't
// move it around while we're futzing with it
pDevMode = GlobalLock(hDevMode);
// Marshal the memory at that pointer into our P/Invoke version of DEVMODE
devMode = (DEVMODE)Marshal.PtrToStructure(pDevMode, typeof(DEVMODE));
short duplex = devMode.dmDuplex;
// Unlock the handle, we're done futzing around with memory
GlobalUnlock(hDevMode);
// And to boot, we don't need that DEVMODE anymore, either
GlobalFree(hDevMode);
return duplex;
}
我使用了pinvoke.net 中的DEVMODE 结构定义。请注意,pinvoke.net 上定义的字符集可能需要根据 B0bi 对原始链接的注释进行一些调整(即,在 DEVMODE 的 StructLayoutAttriute 中设置 CharSet = CharSet.Unicode)。您还需要DM 枚举。并且不要忘记使用 System.Runtime.InteropServices 添加;
您应该能够从这里缩小打印机设置的变化范围。
简短的回答?你没有。不管各种设置说什么,实际的打印机可能被设置为始终双面打印作业。
我不完全确定您计划如何将文档合并在一起,但听起来您可以简单地计算页数并选择性地在文档之间插入空白页,以确保每个新文档都从奇数页开始。
这是一个更大的变化,但如果您愿意迁移到 XPS 工作流程,则有一个名为PageForceFrontSide的页面级工单项目将保证文档不会被错误地粘在一起。
也许这将有助于研究这个问题 http://nicholas.piasecki.name/blog/2008/11/programmatically-selecting-complex-printer-options-in-c-shar/