2

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

我如何确定这是否意味着所选打印机将或不会进行双面打印?

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

4

3 回答 3

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 结构定义。请注意,pinvoke.net 上定义的字符集可能需要根据 B0bi 对原始链接的注释进行一些调整(即,在 DEVMODE 的 StructLayoutAttriute 中设置 CharSet = CharSet.Unicode)。您还需要DM 枚举。并且不要忘记使用 System.Runtime.InteropServices 添加;

您应该能够从这里缩小打印机设置的变化范围。

于 2012-04-09T22:01:31.873 回答
1

简短的回答?你没有。不管各种设置说什么,实际的打印机可能被设置为始终双面打印作业。

我不完全确定您计划如何将文档合并在一起,但听起来您可以简单地计算页数并选择性地在文档之间插入空白页,以确保每个新文档都从奇数页开始。

这是一个更大的变化,但如果您愿意迁移到 XPS 工作流程,则有一个名为PageForceFrontSide的页面级工单项目将保证文档不会被错误地粘在一起。

于 2012-04-10T17:47:45.267 回答
0

也许这将有助于研究这个问题 http://nicholas.piasecki.name/blog/2008/11/programmatically-selecting-complex-printer-options-in-c-shar/

于 2012-04-05T11:01:42.663 回答