簡體   English   中英

使用Winspool訪問打印機狀態

[英]Access Printer Status using 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;
    }
  }
} 

但是,當我調用該函數時,除了打印機名外,我不知道將傳遞哪種數據。 有人可以幫我嗎?

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)

我將在該函數上傳遞什么數據?

我不確定我是否理解您的問題。 您只需要調用GetPrinterInfo方法,它將依次使用Winspool.drv中的函數為您生成托管的PRINTER_INFO_2結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM