C# 如何调用系统打印API
C# 如何调用系统打印API
小弟新手,谁能给个例子
比如这些:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.IO;
namespace ClassLibrary1
{
/*
该类主要是发送指令,添加打印任务
*/
public class PrinterJob
{
/// <summary>
/// OpenPrinter 打开指定的打印机,并获取打印机的句柄
/// </summary>
/// <param name="szPrinter">要打开的打印机的名字</param>
/// <param name="hPrinter">用于装载打印机的句柄</param>
/// <param name="pd">PRINTER_DEFAULTS,这个结构保存要载入的打印机信息</param>
/// <returns>bool</returns>
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
/// <summary>
/// ClosePrinter 关闭一个打开的打印机对象
/// </summary>
/// <param name="hPrinter">一个打开的打印机对象的句柄</param>
/// <returns></returns>
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
/// <summary>
/// StartDocPrinter 在后台打印的级别启动一个新文档
/// </summary>
/// <param name="hPrinter">指定一个已打开的打印机的句柄(用openprinter取得)</param>
/// <param name="level">1或2(仅用于win95)</param>
/// <param name="di">包含一个DOC_INFO_1或DOC_INFO_2结构得缓冲区</param>
/// <returns>bool 注: 在应用程序的级别并非有用。后台打印程序用它标识一个文档的开始</returns>
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
/// <summary>
/// EndDocPrinter 在后台打印程序的级别指定一个文档的结束
/// </summary>
/// <param name="hPrinter">一个已打开的打印机的句柄(用用OpenPrinter获得)</param>
/// <returns>bool</returns>
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
/// <summary>
/// StartPagePrinter 在打印作业中指定一个新页的开始
/// </summary>
/// <param name="hPrinter">指定一个已打开的打印机的句柄(用openprinter取得)</param>
/// <returns>bool注:在应用程序的级别并非特别有用</returns>
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
/// <summary>
/// EndPagePrinter 指定一个页在打印作业中的结尾
/// </summary>
/// <param name="hPrinter">一个已打开的打印机对象的句柄(用OpenPrinter获得)</param>
/// <returns>bool</returns>
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
/// <summary>
/// WritePrinter 将发送目录中的数据写入打印机
/// </summary>
/// <param name="hPrinter">指定一个已打开的打印机的句柄(用openprinter取得)</param>
/// <param name="pBytes">任何类型,包含了要写入打印机的数据的一个缓冲区或结构</param>
/// <param name="dwCount">dwCount缓冲区的长度</param>
/// <param name="dwWritten">指定一个Long型变量,用于装载实际写入的字节数</param>
/// <returns>bool</returns>
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
/// <summary>
/// GetPrinter 取得与指定打印机有关的信息
/// </summary>
/// <param name="handle">一个已打开的打印机的句柄(用OpenPrinter获得)</param>
/// <param name="level">1,2,3(仅适用于NT),4(仅适用于NT),或者5(仅适用于Windows 95 和 NT 4.0)</param>
/// <param name="buffer">包含PRINTER_INFO_x结构的缓冲区。x代表级别</param>
/// <param name="size">pPrinterEnum缓冲区中的字符数量</param>
/// <param name="sizeNeeded">指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量</param>
/// <returns></returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool GetPrinter(IntPtr handle, UInt32 level, IntPtr buffer, UInt32 size, out UInt32 sizeNeeded);
/// <summary>
/// EnumPrinters 枚举系统中安装的打印机
/// </summary>
/// <param name="flags">一个或多个下述标志
/// PRINTER_ENUM_LOCAL 枚举本地打印机(包括Windows 95中的网络打印机)。名字会被忽略
///PRINTER_ENUM_NAME 枚举由name参数指定的打印机。其中的名字可以是一个供应商、域或服务器。如name为NULL,则枚举出可用的打印机
///PRINTER_ENUM_SHARE 枚举共享打印机(必须同其他常数组合使用)
///PRINTER_ENUM_CONNECTIONS 枚举网络连接列表中的打印机(即使目前没有连接——仅适用于NT)
///PRINTER_ENUM_NETWORK 枚举通过网络连接的打印机。级别(Level)必须为1。仅适用于NT
///PRINTER_ENUM_REMOTE 枚举通过网络连接的打印机和打印服务器。级别必须为1。仅适用于NT
///</param>
/// <param name="name">null表示枚举同本机连接的打印机。否则由标志和级别决定</param>
/// <param name="level">1,2,4或5(4仅适用于NT;5仅适用于Win95和NT 4.0),指定欲枚举的结构的类型。如果是1,则name参数由标志设置决定。如果是2或5,那么name就代表欲对其打印机进行枚举的服务器的名字;或者为vbNullString。如果是4,那么只有PRINTER_ENUM_LOCAL和PRINTER_ENUM_CONNECTIONS才有效。名字必须是vbNullString</param>
/// <param name="pPrinterEnum">包含PRINTER_ENUM_x结构的缓冲区,其中的x代表级别(Level)</param>
/// <param name="cbBuf">pPrinterEnum缓冲区中的字符数量</param>
/// <param name="pcbNeeded">指向一个out Long型变量,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量</param>
/// <param name="pcReturned">载入缓冲区的结构数量(用于那些能返回多个结构的函数)</param>
/// <returns>bool</returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool EnumPrinters(int flags, string name, int level, IntPtr pPrinterEnum, int cbBuf, out int pcbNeeded, out int pcReturned);
/// <summary>
/// 获取与指定作业有关的信息
/// </summary>
/// <param name="hPrinter">一个已打开的打印机的句柄(用OpenPrinter获得)</param>
/// <param name="JobId">作业编号</param>
/// <param name="level">1,2,3(仅适用于NT),4(仅适用于NT),或者5(仅适用于Windows 95 和 NT 4.0)</param>
/// <param name="pPrinterEnum">包含PRINTER_INFO_x结构的缓冲区。x代表级别</param>
/// <param name="cbBuf">pPrinterEnum缓冲区中的字符数量</param>
/// <param name="pcbNeeded">指向一个uint32型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量</param>
/// <returns></returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool GetJob(IntPtr hPrinter, UInt32 JobId, UInt32 level, IntPtr pPrinterEnum, UInt32 cbBuf, out UInt32 pcbNeeded);
/// <summary>
/// 枚举打印队列中的作业
/// </summary>
/// <param name="hPrinter">一个已打开的打印机对象的句柄(用OpenPrinter获得)</param>
/// <param name="FirstJob">作业列表中要枚举的第一个作业的索引(注意编号从0开始)</param>
/// <param name="NoJobs">要枚举的作业数量</param>
/// <param name="level">1或2</param>
/// <param name="pJob">包含 JOB_INFO_1 或 JOB_INFO_2 结构的缓冲区</param>
/// <param name="cbBuf">pJob缓冲区中的字符数量</param>
/// <param name="pcbNeeded">指向一个Uint32型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量</param>
/// <param name="pcReturned">载入缓冲区的结构数量(用于那些能返回多个结构的函数)</param>
/// <returns>bool</returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool EnumJobs(IntPtr hPrinter, UInt32 FirstJob, UInt32 NoJobs, UInt32 level, IntPtr pJob, UInt32 cbBuf, out UInt32 pcbNeeded, out UInt32 pcReturned);
/// <summary>
/// 提交一个要打印的作业
/// </summary>
/// <param name="hPrinter">一台已打开的打印机句柄</param>
/// <param name="JobID">作业编号</param>
/// <returns>bool</returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool ScheduleJob(IntPtr hPrinter, out UInt32 JobID);
/// <summary>
/// 取得与指定表单有关的信息
/// </summary>
/// <param name="hPrinter">打印机的句柄</param>
/// <param name="pFormName">想获取信息的一个表单的名字</param>
/// <param name="Level">设为1</param>
/// <param name="pForm">包含FORM_INFO_1结构的缓冲区</param>
/// <param name="cbBuf">pForm缓冲区中的字符数量</param>
/// <param name="pcbNeeded">指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量</param>
/// <returns></returns>
[DllImport("winspool.drv", CharSet = CharSet.Auto)]
public static extern bool GetForm(IntPtr hPrinter, string pFormName, UInt32 Level, IntPtr pForm, UInt32 cbBuf, out UInt32 pcbNeeded);