使用Winspool访问打印机状态

时间:2013-05-04 06:27:46

标签: c# printing status printers printer-properties

您好我已经使用此示例介绍如何使用winspool访问打印机状态。

//Code written by Mark Middlemist - @delradie 
//Made available at http://delradiesdev.blogspot.com
//Interop details from http://pinvoke.net/
using System;
using System.Runtime.InteropServices;

namespace DelradiesDev.PrinterStatus
{
  public class WinSpoolPrinterInfo
  {
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault);

    [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool GetPrinter(IntPtr hPrinter, Int32 dwLevel, IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded);

    [DllImport("winspool.drv", SetLastError = true)]
    public static extern int ClosePrinter(IntPtr hPrinter);

    [StructLayout(LayoutKind.Sequential)]
    public struct PRINTER_DEFAULTS
    {
      public IntPtr pDatatype;
      public IntPtr pDevMode;
      public int DesiredAccess;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct PRINTER_INFO_2
    {
      [MarshalAs(UnmanagedType.LPTStr)]
      public string pServerName;      

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pPrinterName;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pShareName;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pPortName;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pDriverName;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pComment;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pLocation;

      public IntPtr pDevMode;

      [MarshalAs(UnmanagedType.LPTStr)]      
      public string pSepFile;

      [MarshalAs(UnmanagedType.LPTStr)]      
      public string pPrintProcessor;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pDatatype;

      [MarshalAs(UnmanagedType.LPTStr)]
      public string pParameters;

      public IntPtr pSecurityDescriptor;
      public uint Attributes;
      public uint Priority;
      public uint DefaultPriority;
      public uint StartTime;
      public uint UntilTime;
      public uint Status;
      public uint cJobs;
      public uint AveragePPM;
    }

    public PRINTER_INFO_2? GetPrinterInfo(String printerName)
    {
      IntPtr pHandle;      
      PRINTER_DEFAULTS defaults = new PRINTER_DEFAULTS();      
      PRINTER_INFO_2? Info2 = null;

      OpenPrinter(printerName, out pHandle, ref defaults);

      Int32 cbNeeded = 0;

      bool bRet = GetPrinter(pHandle, 2, IntPtr.Zero, 0, out cbNeeded);

      if (cbNeeded > 0)
      {
        IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);

        bRet = GetPrinter(pHandle, 2, pAddr, cbNeeded, out cbNeeded);

        if (bRet)        
        {
          Info2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2));
        }

        Marshal.FreeHGlobal(pAddr);
      }

      ClosePrinter(pHandle);

      return Info2;
    }
  }
} 

但是,当我调用该函数时,我不知道除了printername之外我会传递什么样的数据。有人可以帮帮我吗?

OpenPrinter(string pPrinterName, out IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault)

GetPrinter(IntPtr hPrinter, Int32 dwLevel, IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded)

ClosePrinter(IntPtr hPrinter)

我会传递哪些数据?

1 个答案:

答案 0 :(得分:-1)

我不确定我理解你的问题。您只需要调用GetPrinterInfo方法,然后它将使用Winspool.drv中的函数为您生成托管的PRINTER_INFO_2结构。