C# 查找打印机';s默认双工选项

C# 查找打印机';s默认双工选项,c#,.net,printing,duplex,printer-properties,C#,.net,Printing,Duplex,Printer Properties,对于给定打印文档的PrintSettings,该值可能(并且可能)设置为 我如何确定这是否意味着所选打印机将以双面打印或不以双面打印 如何找到已安装打印机支持的行为的默认值?这可能有助于研究该问题 也许这将有助于研究这个问题 我不确定您是否可以获得给定打印机的默认设置。如果你有创意的话,你可以得到实际的当前值。但是,如果您想确保您拥有正确的信息,就必须使用DEVMODE结构。这不是一个简单的操作,需要一些漂亮的win32fu。这是从几个来源改编的,但在我的测试中起了作用 我使用了pinvoke.

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

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


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

这可能有助于研究该问题
也许这将有助于研究这个问题

我不确定您是否可以获得给定打印机的默认设置。如果你有创意的话,你可以得到实际的当前值。但是,如果您想确保您拥有正确的信息,就必须使用DEVMODE结构。这不是一个简单的操作,需要一些漂亮的win32fu。这是从几个来源改编的,但在我的测试中起了作用

我使用了pinvoke.net中的定义。请注意,根据B0bi上的注释,pinvoke.net上定义的字符集可能需要一些调整(即,在DEVMODE上的StructLayoutAttriute中设置charset=charset.Unicode)。你还需要这个。不要忘记使用System.Runtime.InteropServices添加

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

我不确定您是否可以获得给定打印机的默认设置。如果你有创意的话,你可以得到实际的当前值。但是,如果您想确保您拥有正确的信息,就必须使用DEVMODE结构。这不是一个简单的操作,需要一些漂亮的win32fu。这是从几个来源改编的,但在我的测试中起了作用

我使用了pinvoke.net中的定义。请注意,根据B0bi上的注释,pinvoke.net上定义的字符集可能需要一些调整(即,在DEVMODE上的StructLayoutAttriute中设置charset=charset.Unicode)。你还需要这个。不要忘记使用System.Runtime.InteropServices添加


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

简短回答?你没有。无论各种设置如何,实际打印机可能会设置为始终双面打印打印作业

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


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

简短回答?你没有。无论各种设置如何,实际打印机可能会设置为始终双面打印打印作业

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


这是一个更大的变化,但如果您愿意使用XPS工作流,则会有一个名为的页面级记录单项,它将确保文档不会错误地粘在一起。

我正在尝试想象为什么这会很重要,失败了。@Damien_不信者-我们正在尝试将一系列文档合并成一个文档,以便在一次打印作业中打印。但是,我们需要注意打印作业中将要出现的双面打印选项,以便能够适当地分隔文档,使每个文档从一个新页面开始(而不是从另一个文档的背面开始)。您不能确保每个文档都可以被2整除吗?如果其页数为奇数,则添加空白页。这样它就永远不会打印在另一个文档页面的背面。那么,你真的不在乎双面打印。实际上,我不久前遇到了一个类似的用例,不过对我来说,这是关于正确装订的。源位于链接处,您可以忽略Reporting Services部分。是一个关于识别双面打印设置为true的文档的问题。我正在尝试想象为什么这会很重要,但失败了。@Damien_异教者-我们正在尝试将一系列文档合并到单个文档中,以便在单个打印作业中打印。但是,我们需要注意打印作业中将要出现的双面打印选项,以便能够适当地分隔文档,使每个文档从一个新页面开始(而不是从另一个文档的背面开始)。您不能确保每个文档都可以被2整除吗?如果其页数为奇数,则添加空白页。这样它就永远不会打印在另一个文档页面的背面。那么,你真的不在乎双面打印。实际上,我不久前遇到了一个类似的用例,不过对我来说,这是关于正确装订的。源位于链接处,您可以忽略Reporting Services部分。是关于标识双面打印设置为true的文档的问题。
[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;
}