Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定C语言中DM_OUT_缓冲区的值#_C#_Winapi_Landscape_Portrait_Print Spooler Api - Fatal编程技术网

C# 如何确定C语言中DM_OUT_缓冲区的值#

C# 如何确定C语言中DM_OUT_缓冲区的值#,c#,winapi,landscape,portrait,print-spooler-api,C#,Winapi,Landscape,Portrait,Print Spooler Api,我正在用C#打印文本框的输出。为此,我使用原始打印。 但是,在使用WritePrinter [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool WritePrinter(IntPtr hPrinter, I

我正在用C#打印文本框的输出。为此,我使用原始打印。 但是,在使用
WritePrinter

[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
我想将设备结构修改为横向模式

我可以执行第一个DocumentProperties调用,因为它返回将由
pDevMode
指向的设备结构的大小

IntPtr pDevMode;
.
.
.
int dwNeeded = DocumentProperties(GetForegroundWindow(),
    hPrinter,       /* Handle to our printer. */
    szPrinterName,        /* Name of the printer. */
    IntPtr.Zero,           /* Asking for size, so */
    IntPtr.Zero,           /* these are not used. */
    0);             /* Zero returns buffer size. */

pDevMode = new IntPtr(dwNeeded);
但是,对DocumentProperties的第二次调用需要一个指向设备信息块的指针以及常量
DM\u OUT\u BUFFER
,以告诉函数将设备信息写入设备信息块,由
pDevMode
指向

IntPtr pDevMode;
.
.
.
int dwNeeded = DocumentProperties(GetForegroundWindow(),
    hPrinter,       /* Handle to our printer. */
    szPrinterName,        /* Name of the printer. */
    IntPtr.Zero,           /* Asking for size, so */
    IntPtr.Zero,           /* these are not used. */
    0);             /* Zero returns buffer size. */

pDevMode = new IntPtr(dwNeeded);
如何从C#访问
DM_OUT_BUFFER
的值?我读过很多文章,但没有看到任何能说明这一点的文章

下面列出了大部分完整的原始打印函数,其中不包括不能直接从C#访问的
WinAPI
函数所需的DLL

本例工作正常,除了发送文档纵向模式,即使打印机默认为横向模式

   static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    // SendBytesToPrinter()
    // When the function is given a printer name and an unmanaged array
    // of bytes, the function sends those bytes to the print queue.
    // Returns true on success, false on failure.
    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
        Int32 dwError = 0, dwWritten = 0;
        IntPtr hPrinter = new IntPtr(0);
        DOCINFOA di = new DOCINFOA();
        IntPtr pDevMode;
        bool bSuccess = false; // Assume failure unless you specifically succeed.

        di.pDocName = "My C#.NET RAW Document";
        di.pDataType = "RAW";

        // Open the printer.
        if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
        {
            if (StartDocPrinter(hPrinter, 1, di))
            {
                // Start a page.
                if (StartPagePrinter(hPrinter))
                {
                    // Write your bytes.
                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                    EndPagePrinter(hPrinter);
                }
                EndDocPrinter(hPrinter);
            }
            ClosePrinter(hPrinter);
        }
        // If you did not succeed, GetLastError may give more information
        // about why not.
        if (bSuccess == false)
        {
            dwError = Marshal.GetLastWin32Error();
        }
        return bSuccess;
    }

该常量在windows api中定义,您可以使用pinvoke.net中的以下pinvoke定义:

[标志]
内部枚举模式
{
/// 
///使用时,DocumentProperties函数返回数字
///打印机驱动程序的DEVMODE数据结构所需的字节数。
/// 
DM_SIZEOF=0,
/// 
/// 
/// 
DM_UPDATE=1,
/// 
/// 
/// 
DM_COPY=2,
/// 
/// 
/// 
DM_提示符=4,
/// 
/// 
/// 
DM_MODIFY=8,
/// 
///没有可用的描述。
/// 
DM_OUT_DEFAULT=DM_UPDATE,
/// 
///输出值。该函数写入打印机驱动程序的当前打印设置,
///将私有数据包括到
///PDEVMODEOUT参数。调用方必须分配足够大的缓冲区
///包含信息。
///如果位DM_OUT_BUFFER set清除,则pDevModeOutput参数可以为NULL。
///此值也定义为。
/// 
DM_OUT_BUFFER=DM_COPY,
/// 
///输入值。该函数显示打印机驱动程序的打印设置属性
///然后更改打印机DEVMODE数据结构中的设置
///设置为用户指定的值。
///此值也定义为。
/// 
DM_IN_PROMPT=DM_PROMPT,
/// 
///输入值。在提示、复制或更新之前,函数合并
///打印机驱动程序的当前打印设置与DEVMODE中的设置一致
///由pDevModeInput参数指定的结构。
///该函数仅更新由指定的成员的结构
///DEVMODE结构的dmFields成员。
///此值也定义为。
///如果合并过程中发生冲突,则会更改DEVMODE结构中的设置
///由PDEVMODEFINPUT指定将覆盖打印机驱动程序的当前打印设置。
/// 
DM_IN_BUFFER=DM_MODIFY,
}

非常感谢。我会试一试,让你知道。