对于给定的打印文档PrintSettings
,Duplex
值可能(并且很可能)设置为Duplex.Default
。
如何确定这是否意味着所选的打印机是否会以双面打印?
如何找到已安装打印机支持的行为的默认值?
答案 0 :(得分:3)
我不确定可以获取给定打印机的默认值。但是,如果您具有创造性,则可以获得实际的当前值。但是,如果要确保获得正确的信息,则必须使用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 structure定义。请注意,pinvoke.net上定义的charset可能需要根据B0bi对original link的评论进行一些调整(即,在DEVMODE上的StructLayoutAttriute中设置CharSet = CharSet.Unicode)。您还需要DM enum。并且不要忘记使用System.Runtime.InteropServices;
添加您应该能够从这里缩小您在打印机设置中获得的变化。
答案 1 :(得分:1)
简短回答?你没有。无论各种设置如何说明,实际的打印机都可以设置为始终双面打印作业。
我不完全确定你打算如何将文档合并在一起,但听起来你可以简单地计算页面数量,也可以选择在文档之间插入一个空白页面,以确保每个新文档都在奇数页面上开始。
这是一个更大的变化,但如果您愿意转向XPS工作流程,则会有一个名为PageForceFrontSide的页面级故障单项目,可以保证文档不会被错误地粘在一起。
答案 2 :(得分:0)