查找打印机的默认双面打印选项

时间:2012-04-04 19:56:12

标签: c# .net printing duplex printer-properties

对于给定的打印文档PrintSettingsDuplex值可能(并且很可能)设置为Duplex.Default

如何确定这是否意味着所选的打印机是否会以双面打印?

如何找到已安装打印机支持的行为的默认值?

3 个答案:

答案 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)