2013-05-04 63 views
1

你好我已经使用这个例子说明如何使用winspool访问打印机状态。使用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

我不知道我理解你的问题。你只需调用你的GetPrinterInfo方法,它就会使用Winspool.drv中的函数为你生成托管的PRINTER_INFO_2结构。

+1

如果您不明白这个问题,请尝试首先澄清问题的评论。 – lisp 2013-06-18 07:56:34